Added benchmarks on interface casts & calls

This commit is contained in:
Igor Chevdar
2019-09-09 13:29:13 +03:00
parent bc36fc22f6
commit 6ceeebe73a
3 changed files with 93 additions and 12 deletions
+3 -1
View File
@@ -199,11 +199,13 @@ class RingLauncher : Launcher() {
"Calls.interfaceMethodMonomorphic" to BenchmarkEntryWithInit.create(::CallsBenchmark, { interfaceMethodCall_MonomorphicCallsite() }),
"Calls.interfaceMethodBimorphic" to BenchmarkEntryWithInit.create(::CallsBenchmark, { interfaceMethodCall_BimorphicCallsite() }),
"Calls.interfaceMethodTrimorphic" to BenchmarkEntryWithInit.create(::CallsBenchmark, { interfaceMethodCall_TrimorphicCallsite() }),
"Calls.interfaceMethodHexamorphic" to BenchmarkEntryWithInit.create(::CallsBenchmark, { interfaceMethodCall_HexamorphicCallsite() }),
"Calls.returnBoxUnboxFolding" to BenchmarkEntryWithInit.create(::CallsBenchmark, { returnBoxUnboxFolding() }),
"Calls.parameterBoxUnboxFolding" to BenchmarkEntryWithInit.create(::CallsBenchmark, { parameterBoxUnboxFolding() }),
"CoordinatesSolver.solve" to BenchmarkEntryWithInit.create(::CoordinatesSolverBenchmark, { solve() }),
"GraphSolver.solve" to BenchmarkEntryWithInit.create(::GraphSolverBenchmark, { solve() }),
"Casts.classCast" to BenchmarkEntryWithInit.create(::CastsBenchmark, { classCast() })
"Casts.classCast" to BenchmarkEntryWithInit.create(::CastsBenchmark, { classCast() }),
"Casts.interfaceCast" to BenchmarkEntryWithInit.create(::CastsBenchmark, { interfaceCast() })
)
)
}
@@ -138,6 +138,18 @@ open class CallsBenchmark {
override fun foo() = 314
}
open class X : A() {
override fun foo() = 456456
}
open class Y : A() {
override fun foo() = -398473
}
open class Z : A() {
override fun foo() = 78298734
}
val d = D()
val a1: A = B()
val a2: A = C()
@@ -145,6 +157,9 @@ open class CallsBenchmark {
val i1: I = a1
val i2: I = a2
val i3: I = d
val i4: I = X()
val i5: I = Y()
val i6: I = Z()
fun finalMethodCall(): Int {
var x = 0
@@ -223,6 +238,27 @@ open class CallsBenchmark {
return x
}
fun interfaceMethodCall_HexamorphicCallsite(): Int {
var x = 0
// TODO: optimize fields accesses
val i1 = i1
val i2 = i2
val i3 = i3
val i4 = i4
val i5 = i5
val i6 = i6
for (i in 0 until RUNS)
x += (when (i % 6) {
1 -> i1
2 -> i2
3 -> i3
4 -> i4
5 -> i5
else -> i6
}).foo()
return x
}
abstract class E {
abstract fun foo(): Any
}
@@ -29,7 +29,7 @@ class CastsBenchmark {
interface I8: I0, I1
open class C8: C3(), I8
private fun foo(c: Any, x: Int, i: Int): Int {
private fun foo_class(c: Any, x: Int, i: Int): Int {
var x = x
if (c is C0) x += i
if (c is C1) x = x xor i
@@ -44,6 +44,21 @@ class CastsBenchmark {
return x
}
private fun foo_iface(c: Any, x: Int, i: Int): Int {
var x = x
if (c is I0) x += i
if (c is I1) x = x xor i
if (c is I2) x += i
if (c is I3) x = x xor i
if (c is I4) x += i
if (c is I5) x = x xor i
if (c is I6) x += i
if (c is I7) x = x xor i
if (c is I8) x += i
if (c is I9) x = x xor i
return x
}
fun classCast(): Int {
val c0: Any = C0()
val c1: Any = C1()
@@ -58,16 +73,44 @@ class CastsBenchmark {
var x = 0
for (i in 0 until RUNS) {
x = foo(c0, x, i)
x = foo(c1, x, i)
x = foo(c2, x, i)
x = foo(c3, x, i)
x = foo(c4, x, i)
x = foo(c5, x, i)
x = foo(c6, x, i)
x = foo(c7, x, i)
x = foo(c8, x, i)
x = foo(c9, x, i)
x += foo_class(c0, x, i)
x += foo_class(c1, x, i)
x += foo_class(c2, x, i)
x += foo_class(c3, x, i)
x += foo_class(c4, x, i)
x += foo_class(c5, x, i)
x += foo_class(c6, x, i)
x += foo_class(c7, x, i)
x += foo_class(c8, x, i)
x += foo_class(c9, x, i)
}
return x
}
fun interfaceCast(): Int {
val c0: Any = C0()
val c1: Any = C1()
val c2: Any = C2()
val c3: Any = C3()
val c4: Any = C4()
val c5: Any = C5()
val c6: Any = C6()
val c7: Any = C7()
val c8: Any = C8()
val c9: Any = C9()
var x = 0
for (i in 0 until RUNS) {
x += foo_iface(c0, x, i)
x += foo_iface(c1, x, i)
x += foo_iface(c2, x, i)
x += foo_iface(c3, x, i)
x += foo_iface(c4, x, i)
x += foo_iface(c5, x, i)
x += foo_iface(c6, x, i)
x += foo_iface(c7, x, i)
x += foo_iface(c8, x, i)
x += foo_iface(c9, x, i)
}
return x
}