【问题标题】:Profiling scala for loops using hprof使用 hprof 分析 scala for 循环
【发布时间】:2012-03-04 18:10:48
【问题描述】:

大家都知道,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 循环是瓶颈吗?

【问题讨论】:

    标签: scala optimization hprof


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      另外,如果f(i) 很昂贵,那将比循环花费更多的时间。此外,如果f(i) 实际上没有做任何事情,它可能会被完全优化掉。因此,请确保它确实如此(例如,在某处更新计数器、计算总和等)。

      【讨论】:

        猜你喜欢
        • 2022-07-21
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多