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 :)
- NagyZ blogja
- A hozzászóláshoz be kell jelentkezni
- 777 megtekintés