Estoy tratando de hacer una implementación de Mandelbrot rápida/eficiente en Ruby. Hace mucho tiempo, una forma de acelerarlo era usar enteros de punto fijo en lugar de flotadores.multiplicación de enteros rápida/rápida en ruby?
Así que hice el siguiente punto de referencia, comparando float y enteros elevando a un cuadrado, usando multiplicación o cuadrado ** operando.
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
y esto genera la salida siguiente:
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)
que muestra claramente el la multiplicación Fixnum es casi dos veces tan lento como punto flotante.
tengo dos preguntas:
- Puede alguien explicar esto? Una razón que puedo imaginar es que la multiplicación de Fixnum es más lenta debido a la verificación interna de si necesita convertirse o no en Bignum.
- ¿hay una segunda multiplicación de enteros rápidos para ruby?
Asignación ¿podría estar desacelerándose por unas pocas milésimas o centésimas de segundo. (IE, el alcance no utilizado que debe ser monitoreado y limpiado en las pruebas, que no se usa como 'y'.) –