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
