我是F#的新手。我試圖瞭解如何在F#中獲得快速代碼。爲此,我試圖編寫兩種方法(IsPrime1
和IsPrime2
)進行基準測試。我的代碼是:爲什麼我的遞歸比Array.exists更快?
// Learn more about F# at http://fsharp.net
open System
open System.Diagnostics
#light
let isDivisible n d = n % d = 0
let IsPrime1 n =
Array.init (n-2) ((+) 2) |> Array.exists (isDivisible n) |> not
let rec hasDivisor n d =
match d with
| x when x < n -> (n % x = 0) || (hasDivisor n (d+1))
| _ -> false
let IsPrime2 n =
hasDivisor n 2 |> not
let SumOfPrimes max =
[|2..max|] |> Array.filter IsPrime1 |> Array.sum
let maxVal = 20000
let s = new Stopwatch()
s.Start()
let valOfSum = SumOfPrimes maxVal
s.Stop()
Console.WriteLine valOfSum
Console.WriteLine("IsPrime1: {0}", s.ElapsedMilliseconds)
//////////////////////////////////
s.Reset()
s.Start()
let SumOfPrimes2 max =
[|2..max|] |> Array.filter IsPrime2 |> Array.sum
let valOfSum2 = SumOfPrimes2 maxVal
s.Stop()
Console.WriteLine valOfSum2
Console.WriteLine("IsPrime2: {0}", s.ElapsedMilliseconds)
Console.ReadKey()
IsPrime1
需要760毫秒,而IsPrime2
需要260ms的相同的結果。
這裏發生了什麼事以及如何讓我的代碼更快?
較慢的版本分配一個巨大的數組,然後通過它 - 這是緩慢的 - 你的直接版本有效地將一個數字保存在一個寄存器中 –
此外,你不需要使用'#light' –