Профилирование scala для циклов с использованием hprof - PullRequest
6 голосов
/ 17 октября 2011

На улице говорят, что циклы в 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, каким будет метод в разделе «Образцы ЦП»?

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

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

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

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

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

2 голосов
/ 17 октября 2011

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

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

...