diff --git a/bench-run/inputs/map.in b/bench-run/inputs/map.in deleted file mode 100644 index 4555a56acbc3..000000000000 --- a/bench-run/inputs/map.in +++ /dev/null @@ -1 +0,0 @@ -size:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 diff --git a/bench-run/inputs/drop.in b/bench-run/inputs/tuples/drop.in similarity index 100% rename from bench-run/inputs/drop.in rename to bench-run/inputs/tuples/drop.in diff --git a/bench-run/inputs/split.in b/bench-run/inputs/tuples/split.in similarity index 100% rename from bench-run/inputs/split.in rename to bench-run/inputs/tuples/split.in diff --git a/bench-run/inputs/take.in b/bench-run/inputs/tuples/take.in similarity index 100% rename from bench-run/inputs/take.in rename to bench-run/inputs/tuples/take.in diff --git a/bench-run/inputs/zip.in b/bench-run/inputs/zip.in deleted file mode 100644 index 4555a56acbc3..000000000000 --- a/bench-run/inputs/zip.in +++ /dev/null @@ -1 +0,0 @@ -size:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50 diff --git a/bench-run/src/main/scala/dotty/tools/benchmarks/specialization/Functions.scala b/bench-run/src/main/scala/dotty/tools/benchmarks/specialization/Functions.scala new file mode 100644 index 000000000000..191e5e9fa2f9 --- /dev/null +++ b/bench-run/src/main/scala/dotty/tools/benchmarks/specialization/Functions.scala @@ -0,0 +1,71 @@ +package dotty.tools.benchmarks.specialization + +import org.openjdk.jmh.annotations._ +import scala.util.Random + + +@State(Scope.Benchmark) +class Functions { + extension (x: Int) + inline def times(inline work: Int): Int = { + var res = 0 + var count = 0 + while count < x do + res += work + 1 + count += 1 + res + } + + class ByName { + def foo(x: => Int): Int = x + } + + // outsmart JVM with storage in mutable array + var byName = new ByName + var arrByName = Array(byName, null) + + @Benchmark + def byNameBench(): Int = 10000.times { + // necessary to outsmart JVM + // remove it will result in 200x speed up + arrByName(1) = null + arrByName(0).foo(6) + } + + + var fn = (x: Int) => x + 1 + var arr = Array(fn, null) + @Benchmark + def lambdaBench(): Int = 10000.times { + arr(1) = null + arr(0)(2) + } + + class Func1[T](fn: T => Int) extends Function1[T, Int] { + def apply(x: T): Int = fn(x) + } + class Fn extends Func1(identity[Int]) + + var fn1: Function1[Int, Int] = new Fn + var arr1 = Array(fn1, null) + + @Benchmark + def extendFun1Bench(): Int = 10000.times { + arr1(1) = null + arr1(0)(12) + } + + + class Func2 extends Function2[Int, Int, Int] { + def apply(i: Int, j: Int) = i + j + } + + var fn2: Function2[Int, Int, Int] = new Func2 + var arr2 = Array(fn2, null) + + @Benchmark + def extendFun2Bench(): Int = 10000.times { + arr2(1) = null + arr2(0)(1300, 37) + } +} diff --git a/bench-run/src/main/scala/tuples/Drop.scala b/bench-run/src/main/scala/dotty/tools/benchmarks/tuples/Drop.scala similarity index 100% rename from bench-run/src/main/scala/tuples/Drop.scala rename to bench-run/src/main/scala/dotty/tools/benchmarks/tuples/Drop.scala diff --git a/bench-run/src/main/scala/tuples/Split.scala b/bench-run/src/main/scala/dotty/tools/benchmarks/tuples/Split.scala similarity index 100% rename from bench-run/src/main/scala/tuples/Split.scala rename to bench-run/src/main/scala/dotty/tools/benchmarks/tuples/Split.scala diff --git a/bench-run/src/main/scala/tuples/Take.scala b/bench-run/src/main/scala/dotty/tools/benchmarks/tuples/Take.scala similarity index 100% rename from bench-run/src/main/scala/tuples/Take.scala rename to bench-run/src/main/scala/dotty/tools/benchmarks/tuples/Take.scala