Devi mettere in conto più cose: la leggibilità. L'opzione 2 sembra molto più leggibile dell'opzione 1.
Oltre alla leggibilità, in questo esempio, vorrei passare all'opzione 2 per un motivo che spiegherò di seguito.
Ecco una rappresentazione del tuo codice in Java e il bytecode prodotto:
public class Main {
public static int totalRevenue;
public static int totalProfit;
public static int option1(int numSold, int price, int cost) {
// Option 1 (memory)
totalRevenue += numSold * price;
totalProfit += numSold * price - numSold * cost;
return numSold * price;
}
public static int option2(int numSold, int price, int cost) {
// Option 2 (time)
int saleRevenue = numSold * price;
totalRevenue += saleRevenue;
totalProfit += saleRevenue - numSold * cost;
return saleRevenue;
}
}
Bytecode:
public class Main {
public static int totalRevenue;
public static int totalProfit;
public Main();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static int option1(int, int, int);
Code:
0: getstatic #2 // Field totalRevenue:I
3: iload_0
4: iload_1
5: imul
6: iadd
7: putstatic #2 // Field totalRevenue:I
10: getstatic #3 // Field totalProfit:I
13: iload_0
14: iload_1
15: imul
16: iload_0
17: iload_2
18: imul
19: isub
20: iadd
21: putstatic #3 // Field totalProfit:I
24: iload_0
25: iload_1
26: imul
27: ireturn
public static int option2(int, int, int);
Code:
0: iload_0
1: iload_1
2: imul
3: istore_3
4: getstatic #2 // Field totalRevenue:I
7: iload_3
8: iadd
9: putstatic #2 // Field totalRevenue:I
12: getstatic #3 // Field totalProfit:I
15: iload_3
16: iload_0
17: iload_2
18: imul
19: isub
20: iadd
21: putstatic #3 // Field totalProfit:I
24: iload_3
25: ireturn
}
Per motivi di comprensibilità, iload_ * carica i dati dallo stack e istore_ * memorizza i dati nello stack.
Quindi puoi notare che hai davvero salvato un'allocazione di memoria, ma passi preziosi cicli della CPU.
Ma ecco la ragione: Le allocazioni di memoria funzionano in blocchi, non a livello di byte . Ogni volta che viene eseguito un thread, verrà allocata una certa quantità di memoria da utilizzare nelle operazioni di stack. Quindi, a meno che tu non sia abbastanza fortunato da avere questi 4 byte di allocazione della memoria di overflow per questo blocco (e che ti richiede di impostare una dimensione dello stack più grande), finirai per spendere la stessa quantità di memoria per eseguire entrambi gli esempi. Ma nel secondo, passerai più cicli facendo calcoli matematici.