real-time profiling #2

tegyuk fel, hogy van egy ilyen tobbszalu programom:


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService pool = Executors.newFixedThreadPool(2);
        for(int i = 0; i < 4; i++)
            pool.submit(new Calculate());
        pool.shutdown();
    }
}

es ezt szeretnem profileozni... :-)

a Calculate kodja vegtelenul egyszeru:


import java.util.concurrent.Callable;

public class Calculate implements Callable<Long> {
    public Long call() throws Exception {
        long x = 0L;
        for(int i = 0; i < Integer.MAX_VALUE; i++)
            x += i;
        return x;
    }
}

muszaj Callableval megcsinalni, sima Runnable eseten ugye voiddal kene visszaterni, igy max eldobnad, amit kiszamoltal,
de ezt a fordito eszrevenne, es mar a ciklust is kioptimalizalna, igy lathatnank kemeny 10-50mses eredmenyeket ra.

lassuk, mit ad erre a profiler:


[nagyz@prime agent]$ java -javaagent:TestAgent.jar -jar TestAgentTest.jar
1446ms   [4 calls]      testagenttest.Calculate.call
74ms     [1 calls]      testagenttest.Main.main
0ms      [4 calls]      testagenttest.Calculate.<init>
[nagyz@prime agent]$

tehat tobbszalu programra is jol mukodik, megtapsolhatjuk magunkat.

ami kell meg: JMX interfesz (most shutdown hook van, ami tokjo, csakhat futo alkalmazast szeretnenk profileozni, ugyebar), ki kell merni me'g, hogy mennyi az overhead, tovabba most a Profiler class singleton, ha a classba egy final fieldbe beraknank ennek a getInstance hivasat, akkor sokat sporolhatnank, mert azert a stack sincs ingyen.

ja, es erdekes dolog a JVMrol: minden tipus egy egyseg az operativ stacken, kiveve a double es a float, az ket egyseg. amit konnyen be lehet nezni, hogy ahoz, hogy meghivj valamit, szinten kell egy unit, szoval egy x(int, int) hivasa harom egysegedbe fog kerulni a stacken. most egyszeruen megoldottam ezt a kerdest, fixen hozzaadok +4et a maximalis stack melyseghez (ezt minden osztaly bytecodeja tartalmazza, forditasnal kerul kiszamolasra), azonban ez nem optimalis; nem tudom mekkora performance penaltyt jelent.

azt nem igerem, hogy a teljes kodot meg tudom nyitni, de a tapasztalatokat osszefoglalom :)