Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Profiling scala for loops using hprof

Word on the street is that for loops in scala are slower than while loops.

Slow:

for (i <- 0 until 10000) {
  f(i)
}

Fast:

var i = 0
while (i < 10000) {
   f(i)
   i += 1
} 

How do I use hprof to tell whether the for loops are the bottleneck in my code? I'm profiling my code using -agentlib:hprof=cpu=samples, what would the method be in the "CPU SAMPLES" section?

I'd like to know where to focus my optimization efforts. Are for loops the bottleneck?

like image 738
dsg Avatar asked Oct 16 '11 21:10

dsg


2 Answers

I think you may have more luck with tools specialized with profiling such as yourkit or visualvm.

They usually have interface to capture CPU sample and then drill down to see what calls consumed most CPU cycles.

Bottlenecks of any kind would show up (like taking 95% of the CPU time) and then you could drill down until you see what methods of yours (or the library) is on the call stack for those hot spots. Then you can see if for loops are involved.

like image 106
huynhjl Avatar answered Oct 17 '22 22:10

huynhjl


Put each loop in its own method, then compare the time taken by the methods. And use enough iterations to actually take some time (or wrap those in another loop). 10000 iterations should take microseconds; that's hard for a profiler to measure. Try a billion (or 100k iteratons of 10k iterations).

Also, if f(i) is expensive, that will take far more time than the loop will. Also, if f(i) doesn't actually do anything, it might get optimized away entirely. So make sure it does (e.g. update a counter somewhere, compute a sum, or something).

like image 21
Rex Kerr Avatar answered Oct 17 '22 22:10

Rex Kerr