我正在尝试在 Ruby 中快速/高效地实现 Mandelbrot。很久很久以前,加速它的一种方法是使用定点整数而不是浮点数。
所以我做了以下基准,使用乘法或平方**操作数将浮点数和整数提升到平方比较。
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
这会生成以下输出:
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)
这清楚地表明 Fixnum 乘法几乎是浮点数的两倍。
我有两个问题:
- 谁能解释一下?我可以想象的一个原因是 Fixnum 乘法较慢,因为内部检查是否需要将其转换为 Bignum。
- 其次,红宝石是否有一个快速的整数乘法?