私はF#を学んでいます。私はこの言語について私を夢中にしているのはパフォーマンスです。私は、慣用的なF#を同じ言語で書かれた命令的スタイルのコードと比較する小さなベンチマークを書いた。そして驚いたことに、機能的なバージョンはかなり速く出てくる。Seq.mapは通常のforループより速いですか?
ベンチマークで構成されていますFile.WriteAllLinesを使用して同じ結果をファイルに書き戻す各行内の文字の順序
- File.ReadAllLines
- を使用して、テキストファイルを読み込みます。
は、ここでは、コードです:
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%で完了します。私の質問は、それはなぜですか?命令版では明らかな非効率性は見られません。
Kudos @Dr_Asikよく準備された質問です。 –