2011-11-01 17 views
14

¿Alguien puede recomendar una herramienta de creación de perfiles de rendimiento con buena compatibilidad con F #?Herramienta de generación de perfiles de rendimiento Buena 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 un poco 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 

me sale el siguiente árbol de llamadas:

CallTree

Cuando veo Microsoft.FSharp.Core.FSharpFunc`2. Invocar (0) en la función Detalles Veo: Function Details

Entiendo que qué Estoy viendo que 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 creación de perfiles con F # y hacen un mejor trabajo de mapeo al código F # original?

+0

Ha intentado la opción para el muestreo de la CPU en lugar de la instrumentación en llamadas de función? – gradbot

Respuesta

6

Mi respuesta puede decepcionarte, pero podría ser útil.

Hace unos meses, traté de encontrar un buen .NET profiler gratis 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 su presentación de resultados 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 código F #, también encuentro CLR Profiler y ILSpy dignos de mencionar. 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.

ACTUALIZACIÓN:

Dave Thomas ha escrito an excellent blog post donde utilizó varios perfiladores comerciales para detectar pérdidas de memoria y afinar una aplicación asíncrona. Eche un vistazo a esos perfiladores; pueden adaptarse a tu preferencia

+2

¡Gracias por la mención! El principal problema es mapear los nombres de nuevo a los tipos de F #, consultar la evaluación de http://www.jetbrains.com/profiler/ si tuviera una opción de "líneas de código" que le permita perfilarse en la línea ofensiva – 7sharp9

+0

Do ¿Conoces alguna herramienta que funcione en mac? – czifro

4

Parece que su perfil está en 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.

enter image description here

Esto también sería un buen caso para la optimización de llamada 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 

enter image description here

+0

Intenté ejecutarlo en modo de lanzamiento y me aseguré de que "Código de Optimize" esté marcado, pero igual obtuve el mismo resultado. ¿Me estoy perdiendo de algo? –

+2

@KeithHarrison las llamadas de invocación no desaparecerán en este caso porque esta función no es recursiva de cola. Pruebe la versión de llamada final que agregué. El depurador también tiene un filtro de reducción de ruido. Puede configurarlo para que ignore las llamadas por debajo de% tiempo. – gradbot

Cuestiones relacionadas