我正在學習F#,並且關注這門語言的一件事情就是性能。我寫了一個小型的基準測試,我比較慣用的F#和使用相同語言編寫的命令式代碼 - 令我驚訝的是,功能版本顯着加快了速度。Seq.map比普通for循環更快嗎?
基準包括:
- 閱讀文本文件中使用File.ReadAllLines
- 每行
- 寫回結果使用File.WriteAllLines同一個文件內反轉字符的順序。
下面的代碼:
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
無論文件的大小,「F#風格」版本,大約75%的的「C#風格」版本的時間完成。我的問題是,這是爲什麼?在命令式的版本中,我看不到任何明顯的低效率。
榮譽@Dr_Asik準備充分的問題。 –