【发布时间】:2009-11-24 18:12:30
【问题描述】:
我正在尝试在 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。
- 其次,对于 ruby 是否有快速整数乘法?
【问题讨论】:
-
分配可能会使您的速度减慢千分之几或百分之一秒。 (IE,必须在测试中监控和清理的未使用范围,不像
y那样使用。)
标签: ruby multiplication mandelbrot