使用hprof分析循环的scala

时间:2011-10-16 21:55:00

标签: scala optimization hprof

街道上的Word是scala中的循环比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循环是瓶颈吗?

2 个答案:

答案 0 :(得分:3)

我认为您可以使用专门用于分析的工具,例如yourkitvisualvm

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

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

答案 1 :(得分:2)

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

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