Tôi đang học F # và một điều khiến tôi lo ngại về ngôn ngữ này là hiệu suất. Tôi đã viết một chuẩn mực nhỏ nơi tôi so sánh thành ngữ F # với mã kiểu mệnh lệnh được viết bằng cùng một ngôn ngữ - và nhiều điều khiến tôi ngạc nhiên, phiên bản chức năng xuất hiện nhanh hơn đáng kể.Seq.map nhanh hơn vòng lặp thông thường?
Điểm chuẩn bao gồm:
- Reading trong một file văn bản sử dụng File.ReadAllLines
- Đảo ngược thứ tự của ký tự trong mỗi dòng
- Viết lại kết quả với cùng tập tin sử dụng File.WriteAllLines .
Dưới đây là các mã:
open System
open System.IO
open System.Diagnostics
let reverseString(str:string) =
new string(Array.rev(str.ToCharArray()))
let CSharpStyle() =
let lines = File.ReadAllLines("text.txt")
for i in 0 .. lines.Length - 1 do
lines.[i] <- reverseString(lines.[i])
File.WriteAllLines("text.txt", lines)
let FSharpStyle() =
File.ReadAllLines("text.txt")
|> Seq.map reverseString
|> (fun lines -> File.WriteAllLines("text.txt", lines))
let benchmark func message =
// initial call for warm-up
func()
let sw = Stopwatch.StartNew()
for i in 0 .. 19 do
func()
printfn message sw.ElapsedMilliseconds
[<EntryPoint>]
let main args =
benchmark CSharpStyle "C# time: %d ms"
benchmark FSharpStyle "F# time: %d ms"
0
Dù kích thước của tập tin, phiên bản "F # kiểu" hoàn thành trong khoảng 75% thời gian của phiên bản "C# kiểu". Câu hỏi của tôi là, tại sao vậy? Tôi thấy không có sự kém hiệu quả rõ ràng trong phiên bản bắt buộc.
Kudos @Dr_Asik cho một câu hỏi được chuẩn bị kỹ lưỡng. –