2009-11-11 15 views
7

Algunas funciones son muy fáciles de implementar en OCaml (por ejemplo, un mapa de una lista) pero es posible utilizar el mapa de la biblioteca OCaml: List.mapmódulos OCaml y el rendimiento

Sin embargo, podemos preguntarnos qué código será más eficiente. Llamar a un módulo de una unidad de compilación separada (una biblioteca) puede anular algunas optimizaciones posibles. Leí en el grupo de noticias fa.caml que al llamar a funciones desde bibliotecas, se usan cierres.

Tengo el código OCaml en producción que usa Módulos y Funcionadores para hacer programación genérica. Por razones históricas, mi código es monolítico: todo en un solo archivo. Ahora que tengo más tiempo, estoy dispuesto a separar el código en archivos para dichos módulos. Sin embargo, me temo que puedo perder rendimiento, ya que tardé un tiempo en hacerlo bien. Por ejemplo, tengo módulos para envolver objetos complejos con números, por lo que impongo una representación única y una comparación rápida. Utilizo esos objetos envueltos con mapas, conjuntos y cachés genéricos sobre ellos.

Las preguntas son:

  • voy a perder rendimiento si me mudo a los archivos separados?
  • ¿OCaml está haciendo muchas optimizaciones en mi código lleno de módulos, funtores, etc.?

En C++, si define el método de clase en a .h, el compilador puede terminar enineando métodos cortos, etc. ¿Es posible lograr eso en OCaml usando archivos separados?

+0

No sé mucho sobre las partes internas del compilador o del compilador ocaml, por lo que no puedo responder a su pregunta. Sin embargo, me sorprendería EXTREMADAMENTE si perdiera algún rendimiento al dividir su código en módulos. Incluso si perdiera algunos milisegundos, la mayor claridad de su código valdría la pena. –

+0

En C/C++ que puede causar una gran diferencia. Tengo millones de objetos, accedidos/comparados tropecientos millones de veces. Un conjunto de referencias adicionales por acceso puede ser muy malo. – hectorpal

+0

Sí, pero el compilador debe alinear esas referencias para que en realidad no esté haciendo más búsquedas de las necesarias. ¿Qué tal si intentas realizar un proyecto de prueba con varios módulos ficticios e intentas medir si hay alguna diferencia entre dividirlos y mantenerlos en el mismo archivo? Puede ser mucho menos trabajo que refacturar la base de código de trabajo. Con suerte, esto le dará más confianza de que ocamlopt podrá optimizar de manera inteligente su código. –

Respuesta

9

Puede perder algo de rendimiento. Sin embargo, hay dos factores atenuantes:

  • El compilador de código nativo OCaml puede hacer inline-módulo de cruz, por lo que es posible que el código para ser inline incluso a través de las unidades de compilación por separado (con un par de advertencias - funciones recursivas y los argumentos de función no están insertados en los módulos [1]).
  • El código aún será lo suficientemente rápido, y las ganancias en legibilidad y mantenimiento posiblemente sobrepasen cualquier costo de rendimiento (marginal).

No sé si OCaml defunciona el código donde se definen los funtores en el mismo archivo fuente. Si no es así, los módulos no deberían agregar ningún golpe de rendimiento superior al que ya han incurrido los funtores.

En general, creo que es mejor escribir código sencillo, legible y fácil de mantener y no preocuparse demasiado por características de rendimiento microscópicas como esta a menos que el código demuestre ser demasiado lento en la práctica.

+0

Gracias Michael. Buena información.Por supuesto que sé que ganaré legibilidad. Lo que tengo ahora no es satisfactorio. Sin embargo, en mi caso, el rendimiento del tiempo de ejecución es un problema crítico. Ya he invertido mucho tiempo en cambiar de lista a matriz (ahora estoy usando la biblioteca Res para crecer matrices). También tengo toneladas de memoria caché y una estructura de datos cuidadosamente elegida. Creo que bajé de 10 minutos o peor a 10 segundos haciendo lo que hice. Mi preocupación ahora es principalmente sobre los módulos que envuelven la representación de millones de objetos. Me dividiré de todos modos, pero necesito evaluar el impacto y no puedo dividir todo. – hectorpal

+0

una vez que haya terminado de refactorizar el código, debería ser relativamente fácil mover selectivamente algunos módulos al archivo principal según sea necesario. –