Estoy usando estructuras de datos de Clojure en todas partes pero no estoy usando ninguna evaluación perezosa. ¿Hay una penalización de rendimiento por usar estructuras perezosas en todas partes?Rendimiento de estructuras perezosas Clojure vs hashes/sets/vectores?
Respuesta
A partir del código fuente:
clojure.lang.Cons
(estricta elemento de la lista, clojure.lang.PersistentList
es muy similar), https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/Cons.java#L34
public Object first(){
return _first;
}
clojure.lang.LazySeq
(elemento de secuencia perezoso), https://github.com/clojure/clojure/blob/1.2.0/src/jvm/clojure/lang/LazySeq.java#L77
public Object first(){
seq();
if(s == null)
return null;
return s.first();
}
donde
final synchronized Object sval(){
if(fn != null)
{
try
{
sv = fn.invoke();
fn = null;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
}
if(sv != null)
return sv;
return s;
}
final synchronized public ISeq seq(){
sval();
if(sv != null)
{
Object ls = sv;
sv = null;
while(ls instanceof LazySeq)
{
ls = ((LazySeq)ls).sval();
}
s = RT.seq(ls);
}
return s;
}
Así que usted es definitivamente pagando un precio. Depende mucho de cada caso de uso particular cuánto le afecta ese precio y si se ve compensado por los ahorros de memoria y la falta de cálculos desperdiciados que la evaluación lenta le compra.
Hay una sobrecarga de estructuras perezosas (la respuesta de pmjordan es genial para darle los detalles sangrientos .....). Mi estimación aproximada es que pagas una multa de 2-5 veces.
Sin embargo, también hay algunos aspectos positivos:
- La evaluación perezosa, significa que el conjunto de trabajo de los datos puede ser menor, ya que sólo se crea cuando sea necesario. Este puede mejorar la utilización de su memoria caché y, por lo tanto, el rendimiento en algunos casos
- La evaluación lenta le ayuda a escribir un código más simple y limpio. Para que pueda centrar su atención en escribir mejores algoritmos. El beneficio de tener un mejor algoritmo (p. Ej. O (n log n) vs O (n^2)) puede valer mucho más que la sobrecarga de evaluación perezosa
Mi consejo sería utilizar la evaluación diferida libremente a menos que esté seguro de que se encuentra en una situación en la que realmente necesita un alto rendimiento y no puede pagar los gastos generales (por ejemplo, procesamiento de imágenes o algo así ...)
- 1. Clojure mirar hacia arriba vector rendimiento vs conjunto
- 2. Clojure: reducir vs aplican
- 3. Estructuras vs clases en C++
- 4. clojure vs. Ruby
- 5. with-meta vs^{} - Clojure
- 6. Clojure: resto vs.
- 7. rendimiento D: Unión vs @property
- 8. Conversión de colecciones Java en estructuras de datos Clojure
- 9. Implementación de estructuras de datos personalizadas usando Clojure Protocols
- 10. recursivo (doall) en clojure
- 11. Cómo sumar varios vectores de algunas estructuras en Clojure
- 12. nchar vs nvarchar rendimiento
- 13. CSV vs MySQL rendimiento
- 14. RenderAction vs RenderPartial rendimiento
- 15. JavaScript - === vs == operadores rendimiento
- 16. git vs mercurial rendimiento
- 17. SimpleXML vs DOMDocument rendimiento
- 18. Rendimiento - Date.now() vs date.getTime()
- 19. Cadena vs GString Rendimiento
- 20. DataContractSerializer vs BinaryFormatter rendimiento
- 21. Eventos vs. Rendimiento
- 22. Qt vs GTK + rendimiento
- 23. ReSharper VS CodeRush rendimiento
- 24. Rendimiento vs legibilidad
- 25. Sincronizado vs ReentrantLock en el rendimiento
- 26. Clojure nil vs Java null?
- 27. Servlet Vs Struts2 Rendimiento
- 28. Rendimiento de ReceiveAsync vs. BeginReceive
- 29. Rendimiento de XPath vs DOM
- 30. rendimiento de adaptIntegrate vs. integrar