2012-08-31 73 views
15

Deseo crear un perfil de mi programa escrito en Haskell.Perfil Haskell sin instalar la instalación de bibliotecas de creación de perfiles para todas las dependencias

En la compilación, me informaron que no tengo bibliotecas de creación de perfiles para ciertas dependencias (por ejemplo, criterion) instaladas y cabal abortan.

No tengo interés en perfilar partes de esas dependencias; el código llamado desde main ni siquiera los usa.

¿Cómo puedo perfilar mi aplicación sin instalar bibliotecas de creación de perfiles que no necesito y sin eliminar todas esas dependencias?

+0

No puede. Solo instálelos, ¿cuál es el problema? –

+5

1) No los necesito, 2) Instalarlos es increíblemente tedioso: http://stackoverflow.com/questions/1704421/cabal-not-installation-dependencies-when-need-profiling-libraries – nh2

+3

Si bien estoy de acuerdo en que es tedioso, su afirmación de que no los necesita es claramente falsa. –

Respuesta

12

Una buena forma de eludir tener que compilar todo con el uso de perfiles es utilizar la arena de cabal. Le permite configurar un sandbox para una sola aplicación y, por lo tanto, no tendrá que volver a instalar su prefijo completo ~/.cabal. Necesitarás una versión reciente de Cabal, así que primero ejecuta cabal update && cabal install cabal-install.

Una vez que inicializar una caja de arena, crear un archivo cabal.config para incluir las directivas necesarias (en su caso library-profiling: True; executable-profiling: True también puede ser útil.)

Un efecto secundario de esto es que usted puede probar su código con dependencias que no necesitan instalarse globalmente, por ejemplo, versiones experimentales o versiones desactualizadas.

EDITAR: por cierto, no creo que necesite tener perfiles habilitados para criterion para funcionar. En cualquier caso, funciona para mí sin perfiles habilitados. Simplemente escriba un módulo Main que contiene main = defaultMain benchmarks donde benchmarks tiene el tipo [Benchmark], es decir, una lista de puntos de referencia que ha escrito.

A continuación, compilar ese archivo (por ejemplo, la llamamos benchmarks.hs con ghc --make -o bench benchmarks.hs, y ejecutar el programa, ./bench con los argumentos adecuados (consultar la documentación criterio para obtener más detalles. Un buen argumento por defecto es, dicen ./bench -o benchmarks.html que generará un ingenioso informe similar a this one)

+0

Creo que nombrar 'criterion' implicaba algo incorrecto: era solo un ejemplo de una dependencia que tengo y que no quiero perfilar. Debería haber dicho algo así como * "Mi aplicación usa' hunit' para probar, pero no deseo perfilar el código de prueba en sí mismo y, por lo tanto, me gustaría evitar la instalación con el perfil habilitado "*. – nh2

+0

Esto parece una solución alternativa para ahorrar tiempo por el momento. – nh2

+0

El criterio solo es bueno si desea comparar dos funciones * con respecto al tiempo *. No le dice mucho sobre * por qué * su código es lento/rápido. Para encontrar fugas de memoria o errores lazy, aún necesitará perfiles de montón, que necesita el modificador '-prof'. –

8

que tenían el mismo problema esta semana, y aunque había vuelto a compilar todo a mano, que fue instruido en el canal de IRC para hacer lo siguiente:

  1. Ir a su archivo de configuración Cabal (in case you don't know where)
  2. Editar la línea para permitir a los perfiles de la biblioteca (y mientras estás en ello, permitir que la documentación)
  3. Run Cabal Instalar Mundial
6

Como se mencionó en la pregunta que se refieren a en su comentario, una buena manera de resolver este problema en el futuro es habilitar el perfilado en la configuración de cabal. De esta forma, todas las bibliotecas se instalan con soporte de perfiles. Puede que esta no sea una solución satisfactoria, pero creo que muchos optan por ella.

Si solo está interesado en obtener una impresión del uso de la memoria de su programa, puede generar un perfil de montón de su programa usando -hT. Más precisamente, debe compilar el programa con -rtsopts para habilitar las opciones de RTS y luego ejecutarlo usando +RTS -hT. El compilador genera un archivo con la extensión hp. Puede convertir el archivo hp en un archivo postscript con un perfil de pila usando hp2ps. Esto debería funcionar sin ningún tipo de soporte de creación de perfiles, pero tenga en cuenta que soy perezoso para verificarlo ya que he instalado todas las bibliotecas con soporte de perfiles;)

+1

Verificado, es verdad. –

+0

Guau, ¡tienes razón! Los perfiles de montón no necesitan '-prof', por lo que mi problema anterior no surge si solo necesito perfiles de espacio. Bonito. – nh2

+3

Tenga en cuenta que este es solo el caso para '-hT', que es un perfil de montón basado en tipos. Hay otros tipos de perfiles, como perfiles de retención, que aún necesitan '-prof'. –

Cuestiones relacionadas