2011-01-27 18 views
11

Es de conocimiento común que C, F, L, l y M de PatternLayout are slow:¿Qué tan lentos son C, F, L, l y M de PatternLayout (log4j)?

ADVERTENCIA información de ubicación Generación de la persona que llama es extremadamente lento y debe evitarse a menos velocidad de ejecución no es un problema.

Además, this book menciona que algunas aplicaciones solo pueden obtener un 10% de velocidad al cambiar el formato de registro.

Pero la pregunta es, ¿qué tan lentos son estos caracteres de conversión?

+3

¿Por qué no lo mides? – skaffman

+0

@skaffman: Porque entonces este conocimiento no constituiría una pregunta postable. He buscado números o proporciones (lo lento que es) antes de preguntar, pero no encontré nada útil. Eventualmente puedo medir y publicar los hallazgos. También tenga en cuenta que Ceki está cerca y generalmente responde las preguntas de log4j/slf4j, así que esperaba la información oficial. – cherouvim

+2

Estos son * relativamente * lentos, como 10x o más, por lo general la escritura en el disco es mucho más lenta, por lo que si está haciendo algo de eso, puede que no haya tanta diferencia. –

Respuesta

9

Medí localmente en mi computadora usando un FileAppender. Calenté la prueba muy bien, medí muchas ejecuciones y promedié los resultados (relativamente consistentes). El ciclo contenía execs++;log.info("t");. Los números exactos no importan (porque dependen de mi computadora) pero las proporciones sí. Usé log4j-1.2.16.jar en Java 1.6.0_10 (VM de cliente).

Resulta que siempre que alguna de las C, F, L, l or M aparecía en el patrón, el registro era al menos 5 veces más lento.

enter image description here

+1

Para la evaluación comparativa, recomiendo usar http://code.google.com/p/caliper/. Es muy fácil de usar y diseñado por los chicos de Guava. – maaartinus

+0

@maartinus: gracias. ¿Crees que haría alguna diferencia en este simple escenario? – cherouvim

+0

Probablemente no, suponiendo que funcionó el tiempo suficiente y no cometió un error común como dejar que el JIT lo optimice o que no use calentamiento para que JIT tenga tiempo suficiente para compilarlo. Sus figuras parecen realistas, pero es muy fácil equivocarse. – maaartinus

2

asumiendo que no están interesados ​​sólo académicamente en la respuesta, pero están preocupados por el costo de la tala en una aplicación real:

los he usado en aplicaciones de producción y que nunca he planteado un problema, sobre todo porque el registro es un evento relativamente infrecuente. Por supuesto, estas aplicaciones estaban todas vinculadas a E/S (no al disco/partición donde se realizó el registro) y las máquinas tenían suficientes ciclos de CPU de sobra (pero solo eran máquinas PIII-1133), pero esto es válido para la gran mayoría de aplicaciones (web). Solo los usaría hasta que los perfiles muestren que el registro es un cuello de botella y no te preocupes por eso.

6

La razón principal de que éstos están marcados como lento, es porque la información que representan es recuperada por lanzar una excepción y analizar el seguimiento de la pila de la excepción.

Cuando se diseñó PatternLayout, la generación de seguimiento de pila fue un proceso muy costoso, por lo que esta fue una advertencia justa. Los avances en la tecnología JVM han mejorado en esto, por lo que el proceso ya no es tan caro. A pesar de que hay métodos más rápidos para obtener la información necesaria en la actualidad, estos son, que yo sepa, no se utilizan debido a la atención a la compatibilidad con versiones anteriores de Java.

En otras palabras, esto no es tan malo como solía ser.