当前位置 : 主页 > 网络安全 > 测试自动化 >

整数运算性能32与64位

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有2台机器在vs 2010上运行F#2.0 Interactive build 4.0.30319.1.我的一些程序在速度更快的机器上运行得慢得多.问题似乎是32位 Windows上的整数算术性能明显慢于64位Windows. 在稍慢的Windows 7 64位计
我有2台机器在vs 2010上运行F#2.0 Interactive build 4.0.30319.1.我的一些程序在速度更快的机器上运行得慢得多.问题似乎是32位 Windows上的整数算术性能明显慢于64位Windows.

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

网友评论