Dans le précédent billet je vous parlais du passage de Proc à l’aide d’un Symbol. Il faut savoir que ceci entraine l’appel de la méthode d’instance Symbol#to_proc qui convertit donc le Symbol en Proc. Le p’tit bémol est que cette conversion est relativement gourmande.

Faisons le test en prenant un tableau contenant un grand nombre d’entiers et en convertissant tous ces entiers en chaines de caractères et en les plaçant dans un nouveau tableau. La méthode d’instance Fixnum#to_s réalisera la conversion d’entier en chaines de caractères et la méthode d’instance Array#map créera un nouveau tableau contenant ces chaines de caractères.

Voici la façon “standard” pour réaliser ceci :


(1..1000000).map {|i| i.to_s}

Et la façon to_proc donc en passant un Symbol à la méthode map qui sera convertit par la suite en Proc par la méthode to_proc :


(1..1000000).map(&:to_s)

Lançons donc maintenant le benchmark suivant afin de comparer ces 2 méthodes :

1
2
3
4
5
6
7
require 'active_support'
require 'benchmark'

Benchmark.bm do |x|
  x.report("map :") {       (1..1000000).map {|i| i.to_s} }
  x.report("to_proc :") { (1..1000000).map(&:to_s) }
end 

Voilà le résultat que l’on obtient :

      user     system      total        real
map :  4.297000   0.047000   4.344000 (  4.344000)
to_proc : 14.562000   0.062000  14.624000 ( 14.971000)

On voit que la façon de construire un nouveau tableau en convertissant des entiers en chaines de caractères de la manière “standard” est 3 à 4 fois plus rapide qu’avec to_proc.

Sur de gros tableaux ce n’est pas négligeable.

Donc à utiliser avec prudence.