Search code examples
scalafunctional-programmingtiming

How to time scala map functions in an aggregative fashion?


I am having a hard to come up with a solution to time individual functions in a Scala map operation. Let's say I have the following line in my code:

 val foo = data.map(d => func1(d).func2())

where data is a Seq of N elements. How would I go about timing how long my program has executed func1 in total and func2 in total? Since it is a map operation, these functions will be called N times, so each time record should be added to a cumulative time record.

How can I do this without breaking the Scala syntax?

NB: I want to end up with totalTime_inFunc1 and totalTime_inFunc2.


Solution

  • Let's say, func2() returns YourType. Then, you need to return tuple (YourType, Long, Long) from function inside map, where second tuple element is execution time of func1 and third element is exec time of func2. After that, you can easily get execution time from seq of tuples using sum:

    val fooWithTime = {
      data.map(d => {
        def now = System.currentTimeMillis
        val beforeFunc1 = now
        val func1Result = func1(d)
        val func1Time = now - beforeFunc1
        val beforeFun2 = now
        val result = func1Result.func2()
        (result, func1Time, now - beforeFun2)
      }
    }
    val foo = fooWithTime.map(_._1)
    val totalTimeFunc1 = fooWithTime.map(_._2).sum
    val totalTimeFunc2 = fooWithTime.map(_._3).sum
    

    Also, you can easily use your preferred method of calculating execution time instead of System.currentTimeMillis().