Zastanawiam się, dlaczego dostaję tak różne wyniki między pozornie równymi algorytmami w C# i F #.Niepoprawna wydajność kodu F # na prostej pętli w porównaniu do C# - Dlaczego?
F # Kod warianty:
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
Pełna F # kod (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
Pełny kod 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 # Kod trwa dłużej niż 22s w każdym z jego wariantów (założyłem, że różne implementacje przyniosą różne czasy działania, ale wydaje się, że tak nie jest). Z drugiej strony kod C# wydaje się szybszy. Oba dają taki sam wynik końcowy, więc myślę, że algorytmy są równoważne. Sprawdziłem dwukrotnie i kod F # wydaje się być skompilowany z flagą --optimize+
.
Czy robię coś nie tak?
Spróbuj użyć 'do pętla 'for' zamiast' in'. – ildjarn
@ildjarn - dla pętli z 'to' wymaga' int' types, ale tutaj używamy 'BigInteger', więc to nie zadziała. –
@JohnPalmer: Ach, przepraszam, nie zdawałem sobie z tego sprawy (dosłownie nigdy nie użyłem 'for' w F # :-P). – ildjarn