Skip to content
Snippets Groups Projects
02-SumBenchmark.scala 2.52 KiB
Newer Older
package benchmarks

import org.openjdk.jmh.annotations.*

@State(Scope.Benchmark)
class SumBenchmark:
  val bigArray: Array[Int] = (1 to 10000).toArray
  val bigList: List[Int] = (1 to 10000).toList

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench00_arraySumMethod =
    bigArray.sum

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench01_arrayWhileLoopIndex(): Int =
    val length = bigArray.length
    var i = 0
    var sum = 0
    while i < length do
      sum += bigArray(i)
      i = i + 1
    sum

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench02_arrayForLoopIndex(): Int =
    var sum = 0
    for i <- 0 until bigArray.length do sum += bigArray(i)
    sum

  final class OptimizedRange(from: Int, to: Int):
    inline def foreach(inline f: Int => Unit): Unit =
      var i = from
      while i < to do
        f(i)
        i = i + 1

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench03_arrayOptimizedForLoopIndex() =
    var sum = 0
    for i <- OptimizedRange(0, bigArray.length) do sum += bigArray(i)
    sum

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench04_arrayForLoop() =
    var sum = 0
    for n <- bigArray do sum += n
    sum

  extension (array: Array[Int])
Matt Bovel's avatar
Matt Bovel committed
    inline def optimizedForeach(f: Int => Unit): Unit =
      val to = array.length
      var i = 0
      while i < to do
        f(i)
        i = i + 1

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench05_arrayOptimizedForeach() =
    var sum = 0
    bigArray.optimizedForeach(sum += _)
    sum

  extension (array: Array[Int])
    inline def optimizedForeachArgInlined(inline f: Int => Unit): Unit =
      val to = array.length
      var i = 0
      while i < to do
        f(i)
        i = i + 1

  @Benchmark
  def bench06_arrayOptimizedForeachArgInlined() =
    var sum = 0
    bigArray.optimizedForeach(sum += _)
    sum

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench07_listSumMethod =
    bigList.sum

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench08_listForLoopIndex(): Int =
    var sum = 0
    for i <- 0 until bigList.length do sum += bigList(i)
    sum

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench09_listForLoop() =
    var sum = 0
    for n <- bigList do sum += n
    sum

  extension (list: List[Int])
Matt Bovel's avatar
Matt Bovel committed
    inline def optimizedForeach(f: Int => Unit): Unit =
      var curr = list
      while curr != Nil do
        f(curr.head)
        curr = curr.tail

  @Benchmark
  def bench10_listOptimizedForeach() =
    var sum = 0
    bigList.optimizedForeach(sum += _)
    sum

  extension (list: List[Int])
    inline def optimizedForeachArgInlined(inline f: Int => Unit): Unit =
      var curr = list
      while curr != Nil do
        f(curr.head)
        curr = curr.tail

  @Benchmark
Matt Bovel's avatar
Matt Bovel committed
  def bench11_listOptimizedForeachArgInlined() =
    var sum = 0
    bigList.optimizedForeach(sum += _)
    sum