Non capisco cosa sta succedendo! Allora, io le lambda le uso senza farmi
tante domande, ma oggi devo farmene una. Guardate il codice (scusate, e'
pecoreccio), provatelo anche voi... come mai la seconda esecuzione dura di
piu'? Cosa sto sbagliando?
In pratica eseguendo il mio test la forma:
foo(() -> new Consumer(){})
sembra *piu' veloce *di
foo(() -> {})
(cioe' *la seconda ci mette piu' del doppio *con Java8)
Boh? L'unica cosa che posso pensate e' che il JIT interagisca in modo
differente: lanciando infatti il test in un ciclo 10 volte, la seconda
versione ha, dopo la prima esecuzione, piu' o meno gli stessi tempi della
prima.
package spikes;
import java.util.function.Consumer;
public class TestLambda {
public static void main(String[] args) {
long now;
now = System.currentTimeMillis();
foo(new Consumer<String>(){
@Override
public void accept(String text) {
}});
System.err.println("Elapsed:
"+(System.currentTimeMillis()-now)+"ms");
now = System.currentTimeMillis();
foo(text -> {});
System.err.println("Elapsed:
"+(System.currentTimeMillis()-now)+"ms");
}
static void foo(Consumer<String> consumer) {
for (int i=0; i<10; i++) {
try {
Thread.sleep(5);
} catch (InterruptedException ignore) {
// sorry this is a test
}
consumer.accept("");
}
}
}
Con Java8, openjdk version "1.8.0_202"):
$ java spikes/TestLambda
Elapsed: 51ms
Elapsed: *154ms*
Output con Java11, openjdk version "11.0.2", 18.9 (build 11.0.2+9):
$ java spikes/TestLambda
Elapsed: 52ms
Elapsed: *80ms*
Output con Java 12, openjdk "zulu" version "12.0.2", Zulu12.3+11-CA (build
12.0.2+3)
$ java spikes/TestLambda
Elapsed: 52ms
Elapsed: *71ms*
Ciao,
Bruno