Tôi đã tự hỏi tại sao tôi nhận được kết quả khác nhau như vậy giữa các thuật toán rõ ràng bằng nhau trong C# và F #.Hiệu suất mã F # trên vòng lặp đơn giản so với C# - Tại sao?
F # mã biến thể:
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
Full F # mã (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
Full code 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();
}
Chiếc F # mã mất hơn 22s trên bất kỳ biến thể nào của nó (tôi giả định các cách triển khai khác nhau sẽ mang lại thời gian chạy khác nhau nhưng điều đó dường như không phải là trường hợp). Mặt khác, mã C# có vẻ nhanh hơn. Cả hai đều mang lại kết quả cuối cùng giống nhau, vì vậy tôi đoán các thuật toán là tương đương. Tôi đã kiểm tra kỹ và mã F # dường như được biên dịch với cờ --optimize+
.
Tôi có làm gì sai không?
Hãy thử sử dụng một 'để '' for' loop thay vì 'in'. – ildjarn
@ildjarn - đối với các vòng có 'to' yêu cầu' int', nhưng ở đây chúng ta sử dụng 'BigInteger' để nó không hoạt động. –
@ JohnPalmer: Ah, xin lỗi, tôi đã không nhận ra điều đó (theo nghĩa đen tôi chưa bao giờ sử dụng 'for' trong F # :-P). – ildjarn