我有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,也有算法改进的空间 – 筛子运行得更快