【问题标题】:NetBeans profiler showing vastly different execution timesNetBeans 分析器显示截然不同的执行时间
【发布时间】:2015-01-27 02:40:00
【问题描述】:

我正在对两种算法进行基准测试,以解决具有二维点的文件的 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&lt;Point&gt; skylinesBnl = bnl.getSkylinePoints(file); 行的末尾设置分析器以保存结果并输出它们。 sfs 也是如此。

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

BNL:

SFS:

这与我通过手动方式获得的结果大不相同。有什么想法吗?

【问题讨论】:

    标签: java performance netbeans profiling profiler


    【解决方案1】:

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

    同样的事情也适用于任何类型的套接字(除了到内存管道的套接字)因此 WAN/LAN 数据传输以及任何类型的递归算法(因为堆栈乘法)

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

    【讨论】:

    • 所以理论上既然两种算法都访问同一个文件,那么它们之间的区别应该是一样的吧?这意味着因为在 NetBeans 中我有大约 200 毫秒的差异,所以我的手动方式应该有相同的差异。以我的手动方式,虽然有大约 300 毫秒的差异,但这是否在误差范围内(因为我没有进行多次迭代并从中取平均值)? NetBeans 分析器是否也可以计算磁盘 I/O?也许不排除过滤器中的java.io 包?
    • 我……不明白你在问什么。也许谷歌翻译可能会帮助你。
    • 您有什么不明白的地方,所以我可以更好地解释一下?英语是我的母语,我看不出语法错误的地方。
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2013-08-12
    • 2016-03-08
    相关资源
    最近更新 更多