私はRubyで迅速/効率的なマンデルブロ実装を作成しようとしています。ずっと前に、それをスピードアップする1つの方法は、浮動小数点数の代わりに固定小数点整数を使用することでした。
そこで、乗算または二乗**オペランドを使用して、浮動小数点と整数の累乗を二乗と比較して、次のベンチマークを作成しました。
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の乗算が浮動小数点のほぼ2倍遅いことを明確に示しています。
2つの質問があります:
- 誰かがこれを説明できますか?私が想像できる理由は、Fixnumの乗算は、Bignumに変換する必要があるかどうかを内部でチェックするために遅いためです。
- 第二に、ルビーの簡単な整数乗算よりもありますか?