Ciao,

On Tue, Jan 8, 2019 at 8:32 PM Paolo Mossino [email protected]
[it-torino-java-jug] <[email protected]> wrote:
> Penso sia interessante iniziare la discussione non tanto dall'implementazione 
> di Federico, ma dal questo articolo sul design di Flogger:
> https://google.github.io/flogger/anatomy.html
>
> Se ho letto bene, una delle principali obiezioni di Simone era su:
> -----XXX-----XXX-----
> paghi l'if (dentro atDebug()), string concatenation, boxing e varargs array
> -----XXX-----XXX-----
>
> Mi pare flogger ignori completamente l'aspetto della string concatenation 
> (con un implicito "non usarla"),

Come API designer, così sono sicuro al 100% che non verrà usata - come no.

Sempre da quella pagina:

"the allocation of a small instance to hold contextual information for
the log statement is not significant compared to the work we will do
later"

Però non ci sono benchmark results, nessuna definizione di "work we
will do later".
Oh shit, allochiamo perché abbiamo fatto il design delle API così,
però scriviamo che tanto "is not significant" e siamo a posto.
La tecnica dello struzzo funziona sempre ;)

> e risolve le ultime due scrivendo scrivendo una bella valanga di metodi:
> https://github.com/google/flogger/blob/master/api/src/main/java/com/google/common/flogger/LoggingApi.java#L289

Non "risolve" nulla.
Copre alcuni casi, ma non tutti.
Niente lambda.
106 metodi per una interfaccia di logging.

> Se partiamo da codice come quello descritto da Federico, dove:
> -----XXX-----XXX-----
> Raramente ho visto usare "if (isDebugEnabled())" nel codice delle 
> applicazioni su cui ho lavorato
> -----XXX-----XXX-----
>
> se usi una "tradizionale" libreria di logging, senza nessun isLevelEnabled() 
> guard, non avresti comunque gli stessi problemi di "string concatenation, 
> boxing e varargs array" ad ogni chiamata?

Certo che li avresti.

Il fatto che Federico non abbia visto spesso if (isDebugEnabled()) non
si applica a tutti i casi.
In Jetty, è invece usato *sempre* e abbiamo anche misurato gli effetti
di non metterlo e sono devastanti per le performances.

Invece, if (isDebugEnabled()) è ottimizzato molto bene da JITs e CPU.

Però davvero, quanto tempo spende lo sviluppatore medio a leggere
linee di codice che sono log statements, comparate alle linee di
codice del business?
Vale veramente la pena di fare tutto 'sto sforzo quando il cervello
"skippa" la linea di log appena vede il logging pattern, che sia "if
(isDebug...<brain_skip>" oppure "log.atDebu...<brain_skip>", così come
skippa i javadocs, i commenti, ecc.
Occorre uno sforzo di concentrazione per leggere quello che il
cervello "skippa" a causa del riconoscimento di pattern di "lesser
importance"; se tanto lo sforzo di concentrazione lo fai, vedo poca
differenza a usare plain SLF4J oppure Flogger o quella di Federico.

-- 
Simone Bordet
---
Finally, no matter how good the architecture and design are,
to deliver bug-free software with optimal performance and reliability,
the implementation technique must be flawless.   Victoria Livschitz

Reply via email to