6

大街上的消息是 scala 中的 for 循环比 while 循环慢。

减缓:

for (i <- 0 until 10000) {
  f(i)
}

快速地:

var i = 0
while (i < 10000) {
   f(i)
   i += 1
} 

如何使用 hprof 来判断 for 循环是否是我代码中的瓶颈?我正在使用 分析我的代码-agentlib:hprof=cpu=samples,“CPU SAMPLES”部分中的方法是什么?

我想知道我的优化工作应该集中在哪里。for循环是瓶颈吗?

4

2 回答 2

3

我认为您可能会更幸运地使用专门用于分析的工具,例如yourkitvisualvm

它们通常具有捕获 CPU 样本的接口,然后深入查看哪些调用消耗了最多的 CPU 周期。

任何类型的瓶颈都会出现(比如占用 95% 的 CPU 时间),然后您可以向下钻取,直到看到您的(或库)的哪些方法在这些热点的调用堆栈上。然后您可以查看是否涉及 for 循环。

于 2011-10-17T00:02:36.097 回答
2

将每个循环放在自己的方法中,然后比较这些方法所花费的时间。并使用足够的迭代来实际花费一些时间(或将它们包装在另一个循环中)。10000 次迭代需要几微秒;这对于分析器来说很难测量。尝试 10 亿次(或 100k 次迭代的 10k 次迭代)。

此外,如果f(i)价格昂贵,那将花费比循环更多的时间。此外,如果f(i)实际上什么都不做,它可能会被完全优化掉。所以请确保它确实如此(例如在某处更新计数器,计算总和或其他东西)。

于 2011-10-17T02:07:12.173 回答