私は F# を学んでいますが、この言語で気になることの 1 つはパフォーマンスです。慣用的な F# と、同じ言語で記述された命令型スタイルのコードを比較する小さなベンチマークを作成しました。驚いたことに、関数型バージョンの方がはるかに高速です。
ベンチマークは次のもので構成されます。
- 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# スタイル」バージョンは「C# スタイル」バージョンの約 75% の時間で完了します。私の質問は、なぜですか?命令型バージョンに明らかな非効率性は見られません。