When you’re digging into your code in order to increase the performances you probably have to know a couple of things about how the ruby interpreter works. I’ve completed a couple of tests with several interpreters to show you how a simple change can impact.
The ruby interpreters i’ve used in these tests are:
- ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.6.0]
- ruby 1.8.7 (2010-12-23 patchlevel 330) [i686-darwin10.7.0]
- MacRuby 0.8 (ruby 1.9.2) [universal-darwin10.0, x86_64]
- jruby 1.5.6 (ruby 1.8.7 patchlevel 249) (2010-12-03 9cf97c3) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_24) [x86_64-java]
Every time you call a method the ruby interpreter uses a hash structure for the lookup, this is an expansive task, so you can avoid this lookup every time you need to access an instance variable doing it directly with @variable instead of the attr_accessor methods.
This is the test script:
This is the result of the test in seconds (you can see the raw data here)

Another interesting optimization you can probably do is to use the interpolation whatever is possible. Look at this example:
this is the result of the test (and raw data):

JSON e JSONP sono molto spesso utilizzati da rails per dialogare con terze parti, ad esempio per rispondere a chiamate ajax. In rails vi sono diversi metodi per utilizzare JSON.
L’approccio old-school compatibile con rails 2.3 è quello di utilizzare il metodo respond_to e passare un blocco nel quale specificare i vari formati:
Con rails3 è possibile utilizzare il metodo respond_with:
Di default in rails include_root_in_json è true, in alcuni casi è necessario settarlo a false:
Per utilizzare JSONP è sufficiente specificare il metodo di callback nella render:
Tra le novità di ruby1.9 ci sono alcune migliorie sulle espressioni regolari, oltre ad un significativo miglioramento nelle prestazioni, sono state introdotte due nuove funzionalità: look-behind e named captures.
Look Behind
look-ahead e look-behind sono asserzioni che non catturano l’elemento, ma controllano che intorno, rispettivamente davanti e dietro, sia presente o assente. Mentre look-ahead era già presente in ruby 1.8 la look-behind è stata introdotta con la 1.9. Per la look-behind positiva si utilizza la formula (?<=regex), la look-behind negativa invece (?<!regex). Di seguito due esempi, positivo e negativo, di look behind:
Named Capturing Groups
Named capture è una funzionalità a mio avviso molto rubish ed elegante, permette semplicemente di dare un nome alla capture, il nome sarà poi ovviamente la key nel MatchData. Per utilizzare la Named Capture si usa la sintassi (?<name>group). Di seguito un’esempio:
Se necessario utilizzare ruby 1.8 c’è a disposizione la gem di Oniguruma .
Chi si è già aggiornato a rspec2 avrà notato che il vecchio approccio al testing delle routes è deprecato, il vecchio codice non funziona più:
it "should map { :controller => 'comments', :action => 'index' } to /comments" do
route_for(:controller => "comments", :action => "index").should == "/comments"
end
it "should generate params { :controller => 'comments', action => 'index' } from GET /comments" do
params_from(:get, "/comments").should == {:controller => "comments", :action => "index"}
end
C’è stato ultimamente un’interessante dibattito su quale sia la migliore via per procedere a questo tipo di test, nell’attesa che nuovo zucchero venga aggiunto (es: l’uso del nuovo formato di indirizzamento delle routes tipo “controller#action“) il nuovo approccio (che fa un check bidirezionale) è il seguente:
it "routes GET /post/:post_id/comments to comments#index for post_id" do
{:get => "/post/1/comments"}.should route_to(:controller => "comments", :action => "index", :post_id => "1")
end
che però senza questo commit non funziona. Per procedere quindi è necessario al momento aggiornarsi all’ultima release di rspec-rails, modificando il file Gemfile:
group :test do
gem 'rspec-rails', :git=> "git://github.com/rspec/rspec-rails.git"
end
Come nell’approccio olistico il pattern composite non fa altro che scomporre un problema in più parti elementari. Un’esempio può essere il calcolo delle dimensioni di una citta, che è composta da case e quartieri: Read more…
Il factory pattern non descrive altro che un’oggetto che genera un’altro oggetto rispondendo alla domanda di quale classe? Esistono due varianti il factory method e l’factory abstract, l’esempio che segue è preso da wikipedia, ed è l’implementazione classica del factory method scritta in java:
Read more…
Installare Ruby on Rails 3 oggi è molto piu semplice grazie a due tool che aiutano a gestire le dipendenze: RVM per avere diverse istanze di ruby ognuna con un suo set di gemme e bundler che aiuta a gestire i set di gemme necessari per ogni istanza di ruby on rails.
Per installare RVM bisogna innanzitutto assicurarsi che siano installati alcuni pacchetti:
sudo apt-get install subversion bison git-core curl zlib1g-dev libssl-dev
Successivamente lanciare il seguente comando:
bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
a questo punto inserire in ~/.bashrc la seguente linea:
[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm
e voilà, una volta riavviata la shell rvm è pronto per essere utilizzato, per installare ruby 1.9.2 (al momento l’ultima release stabile) basta lanciare il comando:
rvm pkg install zlib
rvm install ruby-1.9.2
Read more…
Capita spesso che al variare di un determinato valore tanti elementi distinti debbano aggiornarsi, ad esempio un grafico che si aggiorna al variare dei valori di una tabella, o le celle di un foglio di calcolo. In tutti questi casi torna utile l’Observer pattern. Nell’esempio che segue variando i valori delle valute verrà automaticamente aggiornato il grafico, ovviamente il numero degli observer non è limitato ad uno.
Read more…
Uno dei pattern piu controversi e discussi (es: leggi qui, qui e qui) è il singleton. Il singleton pattern viene utilizzato quando l’oggetto ha una sola ed unica istanza. Ad esempio alcuni software hanno un’unico file di configurazione o un solo accesso al database. L’implementazione del pattern in ruby è la seguente: Read more…
Social Networks