Sto cercando di realizzare un'implementazione Mandelbrot rapida ed efficiente in Ruby. Molto tempo fa, un modo per velocizzarlo era usare numeri interi fissi invece di float.moltiplicazione rapida/rapida di interi in ruby?
Così ho fatto il seguente benchmark, confrontando float e intero innalzandolo a un quadrato, usando l'operando moltiplicato o quadrato **.
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
e questo genera il seguente output:
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)
che mostra chiaramente la moltiplicazione Fixnum è quasi due volte più lento virgola mobile.
Ho due domande:
- Qualcuno può spiegare questo? Una ragione che posso immaginare è che la moltiplicazione di Fixnum è più lenta a causa del controllo interno, indipendentemente dal fatto che debba essere convertita o meno in un Bignum.
- in secondo luogo c'è una moltiplicazione rapida per rubino?
assegnazione potresti essere rallentando di pochi millesimi o centesimi di secondo. (IE, l'ambito inutilizzato che deve essere monitorato e pulito nei test, che non viene usato come 'y'.) –