J'essaye de faire une implémentation rapide/efficace de Mandelbrot dans Ruby. Il y a très longtemps, une façon de l'accélérer était d'utiliser des entiers à virgule fixe au lieu de flottants. J'ai donc fait le benchmark suivant, en comparant le flottant et l'élévation d'entier à un carré, en utilisant la multiplication ou l'opérande carré **.multiplication rapide/rapide entier en rubis?
require 'benchmark'
Benchmark.bmbm(10) do |x|
x.report("float-multip") do
for z in 0..100000
zf = z.to_f
y = zf*zf
end
end
x.report("float-square") do
for z in 0..100000
zf = z.to_f
y = zf**2
end
end
x.report("int-multip") do
zo = 0
for zi in 0..100000
y2 = zo*zo
zo += 1
end
end
x.report("int-multip") do
for zi in 0..100000
y2 = zi**2
end
end
end
et cela génère la sortie suivante:
Rehearsal ------------------------------------------------
float-multip 0.125000 0.000000 0.125000 ( 0.125000)
float-square 0.125000 0.000000 0.125000 ( 0.125000)
int-multip 0.250000 0.000000 0.250000 ( 0.250000)
int-multip 0.282000 0.000000 0.282000 ( 0.282000)
--------------------------------------- total: 0.782000sec
user system total real
float-multip 0.110000 0.000000 0.110000 ( 0.110000)
float-square 0.125000 0.000000 0.125000 ( 0.125000)
int-multip 0.219000 0.016000 0.235000 ( 0.235000)
int-multip 0.265000 0.015000 0.280000 ( 0.282000)
qui montre clairement la multiplication Fixnum est presque deux fois plus lent que virgule flottante.
J'ai deux questions:
- Quelqu'un peut-il expliquer cela? Une raison que je peux imaginer est que la multiplication de Fixnum est plus lente à cause de la vérification interne si elle doit ou non être convertie en Bignum.
- d'autre part est-ce qu'une multiplication d'entier rapide pour ruby?
affectation pourrait être vous ralentir par quelques millièmes ou centièmes de seconde. (IE, la portée non utilisée qui doit être surveillée et nettoyée dans les tests, qui n'est pas utilisée comme 'y'.) –