ahrefs - Good F#Performance Profiling Tool
jprofiler (2)
¿Alguien puede recomendar una herramienta de perfil de rendimiento con buen soporte de F #?
He estado usando el generador de perfiles de Visual Studio 2010 pero he encontrado algunos problemas al usar F #. Se siente más como que estoy perfilando el código de bytes después de la reflexión que el F # original.
Por ejemplo, al perfilar el siguiente ejemplo ligeramente artificial:
let Add a b =
a + b
let Add1 = Add 1
let rec MultiAdd count =
match count with
| 1 -> 1
| _ -> (Add1 1) + (MultiAdd (count - 1))
MultiAdd 10000 |> ignore
Obtengo el siguiente árbol de llamadas:
Cuando veo Microsoft.FSharp.Core.FSharpFunc`2.Invoke (0) en los detalles de la función que veo:
Entiendo que lo que veo se basa en la implementación subyacente del código compilado y, aunque puedo seguirlo, es difícil.
¿Alguien tiene experiencia en el uso de otras herramientas de generación de perfiles con F # y hacen un mejor trabajo de mapeo al código F # original?
Suena como su perfil en el modo de depuración. Debe habilitar "Optimizar código" desde el proyecto -> propiedades -> menú de compilación. También podría crear un perfil en el modo de lanzamiento que tiene esto habilitado por defecto. Si no lo hace, habrá muchas llamadas de invocación y creación de objetos Tuple, entre otras cosas.
La función MultiAdd anterior no es recursiva de cola. Si lo fuera, también necesitaría habilitar "Generate tail calls" en modo Debug para crear perfiles.
Esto también sería un buen caso para la optimización de la cola de cola.
let Add a b =
a + b
let Add1 = Add 1
let rec MultiAdd total count =
match count with
| 1 -> 1 + total
| _ -> MultiAdd (count - 1) (total + Add1 1)
MultiAdd 10000 0 |> ignore
Mi respuesta puede decepcionarte, pero podría ser útil.
Hace unos meses, traté de encontrar un buen generador de perfiles .NET gratuito para mi proyecto F #. Mi experiencia con nprof , slimtune , EQATEC y (recientemente comercial) Xte Profiler no era decente en absoluto. Descubrí que su soporte para F # era muy limitado, y tuve que recurrir al generador de perfiles de Visual Studio 2010. Creo que la mejor opción es un perfilador comercial (con el que no tengo experiencia).
Después de un tiempo, me acostumbro al generador de perfiles y veo que su presentación de resultados es fácil, clara y comprensible. Si estuviera optimizando programas paralelos, sería inevitable utilizar el Visualizador simultáneo. Dicho eso, lo único que te importa es el rendimiento; llevarse bien con el perfilador VS 2010 vale la pena intentarlo.
Para crear un perfil de código F #, también me parece que CLR Profiler e ILSpy merecen mencionarse. El primero puede visualizar montones en caso de que quiera minimizar la asignación de memoria o la recolección de basura. Este último puede producir un código equivalente en IL o C # (con el que estoy más familiarizado que F #); puede ayudar a comprender cómo funcionan las construcciones de alto orden en F # para usarlas apropiadamente.
ACTUALIZAR:
Dave Thomas escribió una excelente publicación en el blog donde utilizó varios perfiles comerciales para detectar fugas de memoria y ajustar una aplicación asíncrona. Eche un vistazo a esos perfiladores; pueden adaptarse a tu preferencia