cercherò di mettere le mie due centesimi da un'altra prospettiva
Che cosa è esattamente il vantaggio di registrazione parametrizzata?
Basta rinviare toString()
invocazione e concatenazione di stringhe fino realmente necessario, che è quando si ha realmente bisogno di registrare il messaggio. Questo ottimizza le prestazioni quando quella particolare operazione di registrazione è disabilitata. Controllare source code for SLF4J se non si è sicuri.
La registrazione parametrizzata rende le protezioni inutili in tutti i casi?
No.
In quali casi sarebbero guardie di registrazione essere utile?
Quando ci sono altre potenziali operazioni costose.
Per esempio (nel caso questa particolare operazione di registrazione è disabilitata), se abbiamo nessuna guardia registrazione
logger.debug("User: {}", getUserService().getCurrentUser());
- Ci sarebbe pagare il costo da
obj = getUserService().getCurrentUser()
- risparmieremmo il costo da
"User name: " + obj.toString()
Se uso guardia registrazione:
if (logger.isDebugEnabled()) {
logger.debug("User: {}", getUserService().getCurrentUser());
}
- Vorremmo pagare il costo di
logger.isDebugEnabled()
- Ci sarebbe salvare il costo da
obj = getUserService().getCurrentUser()
- ci permetterebbe di risparmiare il costo da
"User name: " + obj.toString()
Nella successiva c ase, salveremmo entrambi i costi al prezzo di controllare lo isDebugEnabled()
due volte quando questa particolare operazione di registrazione è abilitata.
NOTA: questo è solo un esempio, non tentare di discutere le buone/cattive pratiche qui.
Grazie fgelz, questa è la spiegazione più chiara, quindi ho cambiato idea e la risposta. Ti fa pensare che nonostante tutti i diversi quadri, ci sia ancora spazio per l'innovazione nel mondo del disboscamento, in termini di rinvio di operazioni costose .. forse con i delegati –
@MarkD JDK 8 Progetto Lambda aiuterà l'innovazione (http: // openjdk .java.net/projects/lambda /) – fglez
Dovresti anche essere consapevole del fatto che chiamare un metodo varargs (come logger.debug (String, Object ..) sta effettivamente facendo sotto le copertine logger.debug (String, new Object [. ..]). Quindi se non si effettua il wrap delle chiamate, si sta creando (quindi eliminando) un nuovo array Oggetto ogni volta che si attraversa questo metodo, anche se non si scrive mai il contenuto. Se si dispone di un sistema altamente performante o sperimentare la pressione della memoria, quindi questo può accumularsi nel tempo e la chiamata a logger.isDebugEnabled() sarà in-line da una JIT decente se usata molto. SLF4J lo specializza per uno e due argomenti, ma per di più si otterrà zangola – AlBlue