Sto lavorando a un progetto ad alte prestazioni in cui le funzioni lambda di Java 8 sono estremamente utili. Ho trovato, tuttavia, che sono inefficienti quando vengono utilizzati in massa. Ad esempio, supponiamo di dover applicare una funzione lambda 1.000.000 volte:
for (int i = 0; i < 1_000_000; i += 1) {
collection.forEach(thing -> thing.foo());
}
In questo modulo, thing -> thing.foo()
sembra per istanziare 1.000.000 di oggetti, che ha brutte ramificazioni di velocità quando viene fatto ripetutamente. La mia ottimizzazione standard, dove necessario, è stata quella di eseguire il seguente refactoring:
Consumer<Thing> DoFoo = thing -> thing.foo();
for (int i = 0; i < 1_000_000; i += 1) {
collection.forEach(DoFoo);
}
Ciò rimuove il sovraccarico della memoria ed è banale da fare. Questo mi porta alla mia domanda: se qualcosa di così semplice risulta in un così grande guadagno di prestazioni, perché il compilatore Java non esegue questo refactoring per me? Ci sono altre ottimizzazioni che potrebbero essere fatte in modo tale che le prestazioni / overhead lambda siano più prevedibili ed efficienti? Se è così, sono previsti per il rilascio nelle versioni future? Lambdas si è dimostrato straordinariamente efficace, ma quando ho bisogno di preoccuparmi di cose di basso livello quando li uso, degrada l'utilità della loro astrazione.