街道上的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循环是瓶颈吗?
答案 0 :(得分:3)
我认为您可以使用专门用于分析的工具,例如yourkit或visualvm。
它们通常具有捕获CPU样本的接口,然后深入查看哪些调用消耗了大多数CPU周期。
任何类型的瓶颈都会出现(比如占用95%的CPU时间),然后你可以向下钻取,直到看到你的(或库)的哪些方法在这些热点的调用堆栈上。然后你可以看到是否涉及for循环。
答案 1 :(得分:2)
将每个循环放在自己的方法中,然后比较方法所花费的时间。并使用足够的迭代来实际花费一些时间(或将其包装在另一个循环中)。 10000次迭代应该花费几微秒;对于剖析器来说,这很难衡量。尝试十亿(或10k迭代的100k迭代)。
此外,如果f(i)
代价昂贵,那么这将比循环花费更多的时间。此外,如果f(i)
实际上没有做任何事情,它可能会完全被优化掉。所以确保它确实如此(例如,在某处更新计数器,计算总和或其他东西)。