我想知道爲什麼我在C#和F#中的表面上相同的算法之間得到如此不同的結果。與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):
[<EntryPoint>]
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#代碼需要比22S更在其任何變體(我假設不同的實現會產生不同的運行時間,但似乎並非如此)。另一方面,C#代碼似乎更快。兩者都產生相同的最終和結果,所以我猜算法是相同的。我再次檢查,F#代碼似乎與--optimize+
標誌編譯。
我做錯了什麼?
嘗試使用'來''for'循環而不是'in'。 – ildjarn
@ildjarn - 帶'to'的循環需要'int'類型,但在這裏我們使用'BigInteger',所以這不起作用。 –
@JohnPalmer:啊,道歉,我沒有意識到(我從字面上從未在F#中使用過'for' :-P)。 – ildjarn