sábado, 6 de septiembre de 2008

Copy-on-write optimization for StringBuilder and StringBuffer (II)

Continuación sobre Copy-on-write optimization for StringBuilder and StringBuffer.

Bien, parece que sí hay un bug en la Bug Database (no fui capaz de encontrarlo), y sobre el que se hizo un montón de investigación y pruebas, sobre JDK 1.5. Para más información, consultar http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6219959. Como se ve el bug se cerró como "Not fixed"a principios de 2006.

Las explicaciones para el cambio de estrategia de copy-on-write a always-write son, resumidamente:
  • Cuando se derivaban Strings desde StringBuffers en JDK 1.4, había un crecimiento importante en el consumo de memoria en los Strings. Si tengo un StringBuilder con tamaño de buffer N y el String final sólo ocupa N/2 posiciones, la estrategia de compartir el buffer hace que el String ocupe el doble de memoria de lo que debería, mientras que la nueva estrategia lo ajusta.
  • Aparte de esto, está el molesto tema de la inmutabilidad de los Strings. Si se hiciera mal uso de un StringBuilder (ojo, el problema no se daría en StringBuffer), podría darse el caso durante un pequeño lapso de tiempo de que de que un thread esté leyendo un String mientras que otro esté cambiando su contenido porque aún no se haya enterado de la compartición. Casi imposible en la práctica pero teóricamente posible, así que...

Queda el consuelo, leyendo la descripción del bug, de que los ingenieros de Sun pasaron muchas horas con el tema, que cualquier posibilidad que a mi se me iba ocurriendo ya la han considerado (gracioso, en el bug va diciendo "uno podría argumentar que...", "también podría pensarse en...", justo lo que yo había deliverado :-) ).

Y queda el consuelo de que tanto en el foro como el en bug se llega a la conclusión de que un escape analisis sería una solución válida para que Hotspot decidiera hacer la optimización cuando una regiiónd e código sólo es alcanzada por un thread a la vez. Otra cosa es si el esfuerzo merece la pena, claro...

Tengo una idea cojonuda en esta línea. Voy a darle unas vueltas y a proponerla. Tanto en este blog como en el foro de rendimiento.

No hay comentarios: