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?
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. –
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
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. –