我想知道为什么我在C#和F#中显然相同的算法之间得到如此不同的结果.
F#代码变体:
open System
{ 1I..(bigint (Int32.MaxValue / 100)) } |> Seq.sum
let mutable sum = 0I
for i in 1I..(bigint (Int32.MaxValue / 100)) do
sum <- sum + i
sum
let sum = ref 0I
for i in 1I..(bigint (Int32.MaxValue / 100)) do
sum := !sum + i
sum
完整的F#代码(4s):
[]
let main argv =
let sw = new Stopwatch()
sw.Start()
printfn "%A" ({ 1I..(bigint (Int32.MaxValue / 100)) } |> Seq.sum)
sw.Stop()
printfn "took %A" sw.Elapsed
Console.ReadKey() |> ignore
0
完整的C#代码(22s):
static void Main(string[] args) { Stopwatch sw = new Stopwatch(); sw.Start(); BigInteger sum = new BigInteger(0); BigInteger max = new BigInteger(Int32.MaxValue / 100); Console.WriteLine(max); for (BigInteger i = new BigInteger(1); i <= max; ++i) { sum += i; } sw.Stop(); Console.WriteLine(sum); Console.WriteLine(sw.Elapsed); Console.ReadKey(); }
F#代码在其任何变体上都需要超过22秒(我假设不同的实现会产生不同的运行时间,但似乎并非如此).另一方面,C#代码似乎更快.两者都产生相同的最终总和结果,所以我猜算法是等价的.我仔细检查了,F#代码似乎是用--optimize+
标志编译的.
难道我做错了什么?