Профилирование scala для циклов с использованием hprof

Ходят слухи, что циклы for в 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, какой метод будет в разделе «ОБРАЗЦЫ ЦП»?

Я хотел бы знать, на чем сосредоточить усилия по оптимизации. Являются ли циклы узким местом?


person dsg    schedule 16.10.2011    source источник


Ответы (2)


Я думаю, вам больше повезет с инструментами, специализирующимися на профилировании, такими как yourkit или visualvm.

Обычно у них есть интерфейс для захвата выборки ЦП, а затем детализации, чтобы увидеть, какие вызовы потребляют больше всего циклов ЦП.

Появятся узкие места любого рода (например, занимающие 95% процессорного времени), а затем вы сможете детализировать, пока не увидите, какие ваши методы (или библиотеки) находятся в стеке вызовов для этих горячих точек. Затем вы можете увидеть, задействованы ли циклы for.

person huynhjl    schedule 17.10.2011

Поместите каждый цикл в свой собственный метод, затем сравните время, затрачиваемое методами. И используйте достаточно итераций, чтобы действительно занять некоторое время (или заключить их в другой цикл). 10000 итераций должны занимать микросекунды; профилировщику это трудно измерить. Попробуйте миллиард (или 100 000 итераций из 10 000 итераций).

Кроме того, если f(i) дорого, это займет гораздо больше времени, чем цикл. Кроме того, если f(i) на самом деле ничего не делает, он может быть полностью оптимизирован. Поэтому убедитесь, что он это делает (например, где-то обновляете счетчик, вычисляете сумму или что-то в этом роде).

person Rex Kerr    schedule 17.10.2011