我正在学习 F#,而这门语言让我全神贯注的一件事是性能。我编写了一个小型基准测试,将惯用的 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%。我的问题是,为什么会这样?我认为命令式版本没有明显的低效率。