У меня есть 2 машины с F # 2.0 Интерактивная сборка 4.0.30319.1 по сравнению с 2010 г. Некоторые из моих программ работали значительно медленнее на более быстрой машине. Похоже, проблема заключается в том, что целочисленная арифметическая производительность в 32-разрядной версии Windows значительно ниже, чем в 64-разрядной версии Windows.
На чуть более медленной 64-битной машине с Windows 7 (программа указана ниже):
primeCount = 1270607
Действительный: 00: 00: 07.553, ЦП: 00: 00: 07.519, GC gen0: 0, gen1: 0, gen2: 0
На немного более быстрой машине с Windows XP SP2:
primeCount = 1270607
Действительный: 00: 00: 32.800, ЦП: 00: 00: 32.796, GC gen0: 0, gen1: 0, gen2: 0
Таким образом, 32-разрядная версия занимает в 4 раза больше времени, чем 64-разрядная версия. Я предполагаю, что нет существенной разницы из-за различных операционных систем, кроме поддерживаемой длины слова.
Программа:
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
Отправьте программу в интерактив. #time;;
Затем, чтобы измерить истекшее время обработки, а не генерацию номеров диапазонов, выберите строку
let pcountref = ref 0
и все последующие строки и отправьте в интерактив.