Estoy aprendiendo F # y una cosa que me preocupa de este lenguaje es el rendimiento. He escrito un pequeño punto de referencia en el que comparo el F # idiomático con un código de estilo imperativo escrito en el mismo idioma, y para mi sorpresa, la versión funcional sale mucho más rápido.Seq.map más rápido que un bucle for normal?
El índice de referencia se compone de:
- de lectura en un archivo de texto usando File.ReadAllLines
- invirtiendo el orden de los caracteres dentro de cada línea
- volver escribir el resultado en el mismo archivo usando File.WriteAllLines .
Aquí está el código:
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
Sea cual sea el tamaño del archivo, la versión "F # al estilo" se completa en alrededor del 75% del tiempo de la versión "C# de estilo". Mi pregunta es, ¿por qué es eso? No veo una ineficiencia obvia en la versión imperativa.
Kudos @Dr_Asik para una pregunta bien preparada. –