我正在学习F#,其中一个让我担忧的问题是性能。我编写了一个小型基准测试,比较了以同一语言编写的惯用的F#和命令式样式代码,在很大程度上使我惊讶的是,函数式版本运行得更快。
该基准测试包括:
1.使用File.ReadAllLines读取文本文件 2.反转每行中的字符顺序 3.使用File.WriteAllLines将结果写回到同一文件中。
以下是代码:
无论文件大小如何,“F#风格”的版本都可以在“C#风格”的版本时间的75%左右完成。我的问题是,为什么会这样?我没有看到命令式版本中明显的低效率。
该基准测试包括:
1.使用File.ReadAllLines读取文本文件 2.反转每行中的字符顺序 3.使用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%左右完成。我的问题是,为什么会这样?我没有看到命令式版本中明显的低效率。