Per curiosità, ho misurato le prestazioni tra il blocco statico e l'inizializzatore del metodo statico. Innanzitutto, ho implementato i metodi sopra menzionati in due classi Java separati, in questo modo:Blocco statico rispetto al metodo statico - inizializzazione dei campi statici
primo:
class Dummy {
static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();
static {
for(int i=0; i < 1000000; ++i) {
lista.add(new Integer(i));
}
}
}
public class First {
public static void main(String[] args) {
long st = System.currentTimeMillis();
Dummy d = new Dummy();
long end = System.currentTimeMillis() - st;
System.out.println(end);
}
}
Secondo:
class Muddy {
static java.util.List<Integer> lista = new java.util.ArrayList<Integer>();
public static void initList() {
for(int i=0; i < 1000000; ++i) {
lista.add(new Integer(i));
}
}
}
public class Second {
public static void main(String[] args) {
long st = System.currentTimeMillis();
Muddy.initList();
Muddy m = new Muddy();
long end = System.currentTimeMillis() - st;
System.out.println(end);
}
}
Poi eseguito this piccolo script batch per misurare 100 volte e inserire i valori in un file. batchFile.bat First Second dum.res.txt
Successivamente, ho scritto this parte di codice per calcolare il valore medio e la deviazione standard dei valori misurati di Dummy e di Muddy.
questo è il risultato che ho:
First size: 100 Second size: 100
First Sum: 132 Std. deviation: 13
Second Sum: 112 Std. deviation: 9
ed è simile alle mie altre macchine ... ogni volta che provarlo.
Ora mi chiedo, perché è così? Ho controllato il bytecode e Second.class ha un'altra istruzione (chiamata a initList() statico) tra le chiamate a System.currentTimeMillis(). Entrambi fanno la stessa cosa, ma perché il primo è più lento? Non riesco a capirlo davvero solo guardando il bytecode, poiché questa era la prima volta che toccavo javap; Non ho ancora capito il codice byte.
Prova a invertire prima e secondo nella tua chiamata allo script batch e vedere quali sono i risultati :) – antlersoft
Il numero di istruzioni non ha nulla a che fare con quanto tempo impiegano queste istruzioni (che ti dice di attraversare la città piuttosto che attraversare il paese - bene, a meno che non vivi a Lichenstein o qualcosa del genere). Sono esattamente le stesse istruzioni? Ne dubito piuttosto. In una nota a margine, sarei riluttante a usare la tua seconda versione, anche se è più veloce - si basa sul fare quella chiamata 'initList()', qualcosa su cui non avrei mai fatto affidamento. –
@antlersoft Restituisce gli stessi risultati. Già testato. – Mechkov