2011-01-27 10 views
11

E 'risaputo che C, F, L, l e M di PatternLayout are slow:Esattamente quanto sono lenti C, F, L, l e M di PatternLayout (log4j)?

ATTENZIONE informazioni sulla localizzazione del chiamante Generazione è estremamente lento e dovrebbe essere evitato a meno che la velocità di esecuzione non è un problema.

Inoltre, this book indica che alcune applicazioni possono ottenere una velocità del 10% solo modificando il formato di registrazione.

Ma la domanda è: esattamente quanto sono lenti questi caratteri di conversione?

+3

Perché non lo misurate? – skaffman

+0

@skaffman: Perché allora questa conoscenza non costituirebbe una domanda postabile. Ho cercato con difficoltà numeri o proporzioni (di quanto è più lento) prima di chiedere ma non ho trovato nulla di utile. Potrei eventualmente misurare e pubblicare i risultati. Si noti inoltre che Ceki è in giro e di solito risponde alle domande log4j/slf4j quindi speravo nell'intuizione ufficiale. – cherouvim

+2

Questo è * relativamente * lento, come 10x o più, di solito la scrittura su disco è molto più lenta quindi se si sta facendo qualcosa di simile, potrebbe non fare molta differenza. –

risposta

9

Ho misurato localmente sul mio computer utilizzando un FileAppender. Ho riscaldato bene il test, ho misurato molte esecuzioni e calcolato la media dei risultati (relativamente coerenti). Il ciclo contiene execs++;log.info("t"); I numeri esatti non contano (perché dipendono dal mio computer) ma le proporzioni lo fanno. Ho usato log4j-1.2.16.jar su Java 1.6.0_10 (Client VM).

Si scopre che ogni volta che uno degli C, F, L, l or M è apparso nel modello, la registrazione è stata almeno 5 volte più lenta.

enter image description here

+1

Per il benchmark, ti ​​consiglio di utilizzare http://code.google.com/p/caliper/. È molto facile da usare e progettato dai ragazzi Guava. – maaartinus

+0

@maartinus: grazie. Pensi che farebbe qualche differenza in questo semplice scenario? – cherouvim

+0

Probabilmente no, supponendo che abbia funzionato abbastanza a lungo e non hai commesso nessun errore comune come lasciare che il JIT lo ottimizzi o che non usi il warm up per lasciare a JIT il tempo necessario per compilarlo. Le tue cifre sono realistiche, ma è troppo facile sbagliarle. – maaartinus

2

supponendo che non sono solo accademicamente interessati alla risposta, ma sono preoccupati per il costo di registrazione in un'applicazione reale:

li ho utilizzati in applicazioni di produzione e non hanno mai posto un problema, in primo luogo perché la registrazione è un evento relativamente poco frequente. Ovviamente, queste applicazioni erano tutte vincolate all'I/O (non al disco/partizione dove si trovava il logging) e le macchine avevano un sacco di cicli CPU da risparmiare (ma erano solo macchine PIII-1133), ma questo vale per la stragrande maggioranza di (web) applicazioni. Li userei solo fino a quando il profiling non ti mostra che il logging è un collo di bottiglia e non ti preoccupare.

6

La ragione principale per cui questi sono contrassegnati come lento, è perché le informazioni che rappresentano viene recuperato un'eccezione e analizzare la traccia dello stack dell'eccezione.

Quando PatternLayout è stato progettato, la generazione della traccia di stack era un processo molto costoso, quindi questo era un giusto avvertimento. I progressi nella tecnologia JVM sono migliorati, quindi il processo non è più così costoso. Anche se oggi esistono metodi più veloci per ricavare le informazioni necessarie, queste sono - per quanto ne so - non utilizzate a causa dell'attenzione alla retrocompatibilità con le versioni precedenti di Java.

In altre parole, non è così male come prima.