NetBeans探查器显示了截然不同的执行时间

时间:2014-11-28 12:24:18

标签: java performance netbeans profiling profiler

我正在对两个算法进行基准测试,以解决具有二维点的文件上的Skyline查询问题。

我宣布他们:

SkylineAlgorithm bnl = new BNL(); SkylineAlgorithm sfs = new SFS();

然后手动衡量他们的表现:

long startTime = System.nanoTime();
List<Point> skylinesBnl = bnl.getSkylinePoints(file);
long endTime = System.nanoTime();
long durationBnl = (endTime - startTime) / 1000000;

startTime = System.nanoTime();
List<Point> skylinesSfs = sfs.getSkylinePoints(file);
endTime = System.nanoTime();
long durationSfs = (endTime - startTime) / 1000000;

System.out.println("BNL: " + durationBnl + " ms");
System.out.println("SFS: " + durationSfs + " ms");

例如,这将打印:

BNL: 4648 ms
SFS: 4946 ms

然后我想到使用像NetBeans探查器这样更复杂的东西。我将根分析方法设置为getSkylinePoints(file)(两种算法通过模板方法设计模式共享该方法)然后在行List<Point> skylinesBnl = bnl.getSkylinePoints(file);的末尾设置分析器以保存结果并输出它们。 sfs也是如此。

我的结果是这些(在新标签中打开图片):

BNL:

BNL

SFS:

SFS

这与我通过手动方式得到的大不相同。有什么想法发生了什么?

1 个答案:

答案 0 :(得分:0)

答案很简单:getPointRDDFromTextFile显然使用磁盘I / O并产生更复杂的结果。如果你摆脱了I / O-op,你将大大减少执行时间。根据设计,访问任何(!)类型的驱动器总是非常慢。

对于任何类型的套接字都是如此(内存管道的套接字除外)因此WAN / LAN数据传输以及任何类型的递归算法(因为堆栈乘法)

要获得类似的结果,您需要预先获取文件并从内存中读取它...如果它足够小,当然。