我有2台机器在vs 2010上运行F#2.0 Interactive build 4.0.30319.1.我的一些程序在速度更快的机器上运行得慢得多.问题似乎是32位 Windows上的整数算术性能明显慢于64位Windows. 在稍慢的Windows 7 64位计
在稍慢的Windows 7 64位计算机上(程序如下所示):
primeCount = 1270607
Real: 00:00:07.553, CPU: 00:00:07.519, GC gen0: 0, gen1: 0, gen2: 0
在速度稍快的Windows XP SP2计算机上:
primeCount = 1270607
Real: 00:00:32.800, CPU: 00:00:32.796, GC gen0: 0, gen1: 0, gen2: 0
因此,32位版本的速度是64位版本的4倍多.我假设由于不同的操作系统没有显着差异,因此比支持的字长更长.
程序:
let isPrime(n) =
if n < 2 then false
elif (n % 2) = 0 then // take care of even case
if n = 2 then true
else false
else // n is odd
let ms = int(sqrt(float(n)))
let rec isPrimeUtil(m) =
if m > ms then true
elif n % m = 0 then false
else isPrimeUtil(m + 2)
isPrimeUtil(3)
let nums = [1 .. 20000000]
let pcountref = ref 0 // # of primes found
let primeCount =
pcountref := 0
for x in nums do
if (isPrime x) then incr pcountref
do primeCount
printfn "primeCount = %d" !pcountref
将程序发送到交互式. #时间;;然后,要测量处理的经过时间,而不是测量范围nums的生成,请选择该行
let pcountref = ref 0
和所有后续行并发送到交互式.
我认为更可能的解释是64位JIT执行尾部调用优化,32位JIT不执行. isPrimeUtil功能可以优化请注意,给定的示例不使用BigInteger,也有算法改进的空间 – 筛子运行得更快
