functionscalaprofilingaspect

How to profile methods in Scala?


What is a standard way of profiling Scala method calls?

What I need are hooks around a method, using which I can use to start and stop Timers.

In Java I use aspect programming, aspectJ, to define the methods to be profiled and inject bytecode to achieve the same.

Is there a more natural way in Scala, where I can define a bunch of functions to be called before and after a function without losing any static typing in the process?


Solution

  • Do you want to do this without changing the code that you want to measure timings for? If you don't mind changing the code, then you could do something like this:

    def time[R](block: => R): R = {
        val t0 = System.nanoTime()
        val result = block    // call-by-name
        val t1 = System.nanoTime()
        println("Elapsed time: " + (t1 - t0) + "ns")
        result
    }
    
    // Now wrap your method calls, for example change this...
    val result = 1 to 1000 sum
    
    // ... into this
    val result = time { 1 to 1000 sum }