2012-07-31 11 views
8

Sono stato a guardare le varie librerie di registrazione Scala ultimamente, e la stragrande maggioranza di essi implementare le funzioni di registrazione comeprestazioni nelle biblioteche di registrazione scala call-by-value vs chiamata per nome

def debug(s: => String) 

In questo modo, se la registrazione di debug è disattivata, non verrà eseguita la dichiarazione. Tuttavia, mi sono imbattuto in logula in cui si afferma espressamente come uno dei suoi vantaggi

A differenza di molti Scala librerie registrazione, Logula non usa passaggio per nome la semantica (per esempio, f: => A) per le sue dichiarazioni di registrazione, che significa due cose:

  • Il compilatore Scala non ha bisogno di creare una tantum oggetti di chiusura per ogni dichiarazione di registrazione. Questo dovrebbe ridurre la quantità di pressione di raccolta immondizia.

Che in realtà ha senso per me. Quindi la mia domanda è: ci sono dei benchmark/dati sulle prestazioni reali confrontando i 2 approcci? Idealmente qualcosa da un progetto live rispetto a benchmark artificiali?

risposta

8

Quale è più veloce dipende interamente da casi d'uso. Se si stanno registrando stringhe statiche, è più veloce passare semplicemente la stringa costante e ignorarla. Altrimenti, se crei stringhe devi comunque creare almeno un oggetto. Gli oggetti funzione sono piccoli ed economici: è meglio creare uno di quelli che non lo string se lo ignorerai.

Personalmente, penso che questo tipo di comprensione dei compromessi dei primi principi sia ancora più prezioso di un caso di studio di una particolare applicazione che potrebbe aver usato l'uno o l'altro, perché ti consente di capire perché sceglieresti uno o l'altro (e vorrete comunque sempre confrontare la vostra applicazione).

(Nota: quanto costoso creazione dell'oggetto è dipende da come fortemente influenzato è garbage collector, in genere, oggetti di breve durata può essere creato e smaltito ad una velocità di dell'ordine di 10 al secondo, non dovrebbe essere una preoccupazione se non nei loop interni stretti, se metti le dichiarazioni di registrazione in stretti loop interni, penso che qualcosa non va, dovresti scrivere invece dei test unitari.)

+1

'Personalmente, penso che questo tipo di comprensione dei primi principi dei compromessi sia ancora più prezioso di un caso di studio di una particolare applicazione. Mentre sono assolutamente d'accordo con il principio qui, la realtà può essere una bestia completamente diversa da quella che tu anticipare. Ecco perché sto cercando casi di vita reale invece di benchmark, perché chiunque può scrivere un benchmark che faccia sembrare un milione di volte più veloce. Soprattutto per la mia curiosità, perché onestamente, quale applicazione sta registrando davvero il collo di bottiglia? – Falmarri

+0

@Falmarri - Può essere diverso da quello che ci si aspetta _especially_ se si ragiona dagli esempi. Ecco perché ho spiegato i compromessi fondamentali. Sono d'accordo che la registrazione non dovrebbe essere il collo di bottiglia nella maggior parte delle applicazioni. –

+0

@Falmarri Bene ... misurate tutto? Ci sono persone che giurano misurando ogni fase della loro applicazione, tra cui la dimensione della coda, il throughput e il tempo di risposta.Se segui questa strada, non vuoi che la tua registrazione si aggiunga al tempo totale. In realtà, vuoi che sia asincrono. –

3

Uscirò su un ramo e dire che le discussioni filosofiche sui compromessi sono più utili quando c'è un compromesso interessante da fare, vale a dire, non qui.

class A { 
    var debugging = true 
    @inline final def debug(msg: => String) = if (debugging) println(msg) 

    def f = { debug("I'm debugging!") ; 5 } 
} 
% scalac292 -optimise a.scala 
% ls -l *.class 
-rw-r--r-- 1 paulp staff 1503 Jul 31 22:40 A.class 
% 

Contare gli oggetti di chiusura.

+1

Molto buono a sapersi! Anche se potrebbe essere più difficile ottenere l'elision se si sta tentando di usare il log di una libreria esterna per fare il logging ... ma questo semplicemente sostiene che dovresti avere il tuo 'debug def defug finale '@ @inline locale per la chiamata alla libreria in quei posti che ti servono. –