Ich lerne F # und eine Sache, die mich über diese Sprache beschäftigt ist Leistung. Ich habe einen kleinen Benchmark geschrieben, in dem ich idiomatic F # mit imperativem Code in derselben Sprache vergleiche - und zu meiner Überraschung kommt die funktionale Version deutlich schneller raus.Seq.map schneller als eine normale for-Schleife?
Die Benchmark besteht aus:
- Lesen in einer Textdatei File.ReadAllLines
- Umkehrung der Reihenfolge der Zeichen in jeder Zeile
- Schreiben zurück das Ergebnis auf die gleiche Datei mit File.WriteAllLines mit .
Hier ist der Code:
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
Unabhängig von der Größe der Datei, die "F # -Stil" -Version in rund 75% der Zeit der "C# -Stil" Version abgeschlossen ist. Meine Frage ist, warum ist das? Ich sehe keine offensichtliche Ineffizienz in der imperativen Version.
Kudos @Dr_Asik für eine gut vorbereitete Frage. –