Haha, ez jo, megcsinaltam ugyanezt java + jmh -val:
public static int[] f2(int x) {
int[] back = new int[x];
int backi = 0;
for (int i = 0; i < x; i++)
if (!ArrayUtils.contains(back, i)) back[backi++] = i;
return ArrayUtils.subarray(back, 0, 10);
}
@Benchmark
public void one2() {
res = f2(20000)[0];
}
@Benchmark
public void two2() {
res = f2(20000)[0] + f2(20000)[1];
}
eredmeny (1 core, 1 thread, egy 2014-es macbookon):
# Run complete. Total time: 00:01:24
Benchmark Mode Cnt Score Error Units
VsPython.one2 thrpt 20 11.675 ± 0.228 ops/s
VsPython.two2 thrpt 20 5.735 ± 0.178 ops/s
Egyebkent IMHO logikus elvaras, hogy a fordito tudja/sejtse elore, ha egy metodus nem modosit allapotot (es ezen felul meg lehessen explicite mondani), es aszerint optimalizalja az ismetlodo hivasokat.
Valszeg megneztek ezt, BTW, csak a gyakorlatban eleg maceras ilyet stabilra megcsinalni, keves helyen lehet hasznalni, ott meg eccerubb megcsinalni kezzel.
De ez a pypy2 igen erosre sikerult! Eddig mindenhol azt lattam, hogy meg ha van is JIT, doglassu (lasd .net). Felteszem okkal nem hasznalja ezt mindenki, csak nem tudom, mi az :)
PS: teljes kod elerheto: https://github.com/agoston/benchmark/blob/master/src/test/java/com/bol/…