我正在对两个算法进行基准测试,以解决具有二维点的文件上的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:
SFS:
这与我通过手动方式得到的大不相同。有什么想法发生了什么?
答案 0 :(得分:0)
答案很简单:getPointRDDFromTextFile
显然使用磁盘I / O并产生更复杂的结果。如果你摆脱了I / O-op,你将大大减少执行时间。根据设计,访问任何(!)类型的驱动器总是非常慢。
对于任何类型的套接字都是如此(内存管道的套接字除外)因此WAN / LAN数据传输以及任何类型的递归算法(因为堆栈乘法)
要获得类似的结果,您需要预先获取文件并从内存中读取它...如果它足够小,当然。