Skip to content

Commit d882535

Browse files
author
Abduqodiri Qurbonzoda
committed
Refactor list benchmark generators
1 parent c271ac9 commit d882535

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+228
-272
lines changed

benchmarks-libraries/src/main/kotlin/generators/CommonUtilsGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package generators
1818

1919
import java.io.PrintWriter
2020

21-
class CommonUtilsGenerator: BenchmarkUtilsGenerator() {
21+
class CommonUtilsGenerator: UtilsSourceGenerator() {
2222
override val outputFileName: String = "utils"
2323

2424
override fun generateBody(out: PrintWriter) {

benchmarks-libraries/src/main/kotlin/generators/IntWrapperGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package generators
1818

1919
import java.io.PrintWriter
2020

21-
class IntWrapperGenerator: BenchmarkUtilsGenerator() {
21+
class IntWrapperGenerator: UtilsSourceGenerator() {
2222
override val outputFileName: String = "IntWrapper"
2323

2424
override fun generateBody(out: PrintWriter) {

benchmarks-libraries/src/main/kotlin/generators/benchmarkSourceGenerator.kt

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,10 @@ import java.nio.file.Path
3636
import java.nio.file.Paths
3737
import javax.xml.xpath.XPathFactory
3838

39-
abstract class BenchmarkSourceGenerator {
40-
protected abstract fun generateBody(out: PrintWriter): Unit
41-
39+
abstract class SourceGenerator {
4240
abstract val outputFileName: String
43-
4441
open fun getPackage(): String = "benchmarks"
4542

46-
protected open val imports: Set<String> = setOf(
47-
"org.openjdk.jmh.annotations.*",
48-
"java.util.concurrent.TimeUnit"
49-
)
50-
5143
fun generate(out: PrintWriter) {
5244
out.println(readCopyrightNoticeFromProfile(File(".idea/copyright/apache_2_0.xml")))
5345
// Don't include generator class name in the message: these are built-in sources,
@@ -60,6 +52,22 @@ abstract class BenchmarkSourceGenerator {
6052
out.println("import $it")
6153
}
6254
out.println()
55+
56+
generateBody(out)
57+
}
58+
59+
protected abstract val imports: Set<String>
60+
protected abstract fun generateBody(out: PrintWriter): Unit
61+
}
62+
63+
64+
abstract class BenchmarkSourceGenerator: SourceGenerator() {
65+
override val imports: Set<String> = setOf(
66+
"org.openjdk.jmh.annotations.*",
67+
"java.util.concurrent.TimeUnit"
68+
)
69+
70+
override fun generateBody(out: PrintWriter) {
6371
out.println("""
6472
@Fork(1)
6573
@Warmup(iterations = 5)
@@ -69,34 +77,14 @@ abstract class BenchmarkSourceGenerator {
6977
@State(Scope.Thread)
7078
""".trimIndent()
7179
)
72-
73-
generateBody(out)
80+
generateBenchmark(out)
7481
}
75-
}
7682

77-
abstract class BenchmarkUtilsGenerator {
78-
protected abstract fun generateBody(out: PrintWriter): Unit
79-
80-
abstract val outputFileName: String
81-
82-
open fun getPackage(): String = "benchmarks"
83-
84-
protected open val imports: Set<String> = setOf()
83+
protected abstract fun generateBenchmark(out: PrintWriter)
84+
}
8585

86-
fun generate(out: PrintWriter) {
87-
out.println(readCopyrightNoticeFromProfile(File(".idea/copyright/apache_2_0.xml")))
88-
// Don't include generator class name in the message: these are built-in sources,
89-
// and we don't want to scare users with any internal information about our project
90-
out.println("// Auto-generated file. DO NOT EDIT!")
91-
out.println()
92-
out.println("package ${getPackage()}")
93-
out.println()
94-
imports.forEach {
95-
out.println("import $it")
96-
}
97-
out.println()
98-
generateBody(out)
99-
}
86+
abstract class UtilsSourceGenerator: SourceGenerator() {
87+
override val imports: Set<String> = setOf()
10088
}
10189

10290
fun readCopyrightNoticeFromProfile(copyrightProfile: File): String {
@@ -114,12 +102,12 @@ private const val BENCHMARKS_ROOT = "src/jmh/java/"
114102

115103

116104
private val listImpls = listOf(
117-
ListKotlinBenchmark(),
118-
ListPaguroRrbTreeBenchmark(),
119-
ListCyclopsBenchmark(),
120-
ListClojureBenchmark(),
121-
ListScalaBenchmark(),
122-
ListVavrBenchmark()
105+
KotlinListImplementation,
106+
PaguroRrbTreeListImplementation,
107+
CyclopsListImplementation,
108+
ClojureListImplementation,
109+
ScalaListImplementation,
110+
VavrListImplementation
123111
)
124112
private val listBuilderImpls = listOf(
125113
ListBuilderKotlinBenchmark(),
@@ -175,13 +163,21 @@ private val setBuilderImpls = listOf(
175163
)
176164

177165
fun generateBenchmarks() {
178-
val listBenchmarks = listOf(
166+
val listBenchmarks = listImpls.map { listOf(
167+
ListAddBenchmarkGenerator(it),
168+
ListGetBenchmarkGenerator(it),
169+
ListIterateBenchmarkGenerator(it),
170+
ListRemoveBenchmarkGenerator(it),
171+
ListSetBenchmarkGenerator(it),
172+
ListUtilsGenerator(it)
173+
) }
174+
/*listOf(
179175
listImpls.filterIsInstance<ListAddBenchmark>().map { ListAddBenchmarkGenerator(it) },
180176
listImpls.filterIsInstance<ListGetBenchmark>().map { ListGetBenchmarkGenerator(it) },
181177
listImpls.filterIsInstance<ListIterateBenchmark>().map { ListIterateBenchmarkGenerator(it) },
182178
listImpls.filterIsInstance<ListRemoveBenchmark>().map { ListRemoveBenchmarkGenerator(it) },
183179
listImpls.filterIsInstance<ListSetBenchmark>().map { ListSetBenchmarkGenerator(it) }
184-
)
180+
)*/
185181
val listBuilderBenchmarks = listOf(
186182
listBuilderImpls.filterIsInstance<ListBuilderAddBenchmark>().map { ListBuilderAddBenchmarkGenerator(it) },
187183
listBuilderImpls.filterIsInstance<ListBuilderGetBenchmark>().map { ListBuilderGetBenchmarkGenerator(it) },
@@ -230,7 +226,6 @@ fun generateBenchmarks() {
230226
}
231227

232228
fun generateUtils() {
233-
val listUtils = listImpls.filterIsInstance<ListBenchmarkUtils>().map { ListUtilsGenerator(it) }
234229
val listBuilderUtils = listBuilderImpls.filterIsInstance<ListBuilderBenchmarkUtils>().map { ListBuilderUtilsGenerator(it) }
235230

236231
val mapUtils = mapImpls.filterIsInstance<MapBenchmarkUtils>().map { MapUtilsGenerator(it) }
@@ -244,7 +239,7 @@ fun generateUtils() {
244239
CommonUtilsGenerator()
245240
)
246241

247-
val utils = listUtils + listBuilderUtils + mapUtils + mapBuilderUtils + setUtils + setBuilderUtils + commonUtils
242+
val utils = listBuilderUtils + mapUtils + mapBuilderUtils + setUtils + setBuilderUtils + commonUtils
248243

249244
utils.forEach { util ->
250245
val path = util.getPackage().replace('.', '/') + "/" + util.outputFileName + ".kt"

benchmarks-libraries/src/main/kotlin/generators/immutableList/addGenerator.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,23 @@ package generators.immutableList
1919
import generators.BenchmarkSourceGenerator
2020
import java.io.PrintWriter
2121

22-
interface ListAddBenchmark {
23-
val packageName: String
24-
fun listType(T: String): String
25-
val getOperation: String
26-
}
27-
28-
class ListAddBenchmarkGenerator(private val impl: ListAddBenchmark) : BenchmarkSourceGenerator() {
29-
override val outputFileName: String = "Add"
22+
class ListAddBenchmarkGenerator(private val impl: ListImplementation) : BenchmarkSourceGenerator() {
23+
override val outputFileName: String get() = "Add"
3024

3125
override fun getPackage(): String {
3226
return super.getPackage() + ".immutableList." + impl.packageName
3327
}
3428

35-
override val imports: Set<String> = super.imports + "org.openjdk.jmh.infra.Blackhole"
29+
override val imports: Set<String> get() = super.imports + "org.openjdk.jmh.infra.Blackhole"
3630

37-
override fun generateBody(out: PrintWriter) {
31+
override fun generateBenchmark(out: PrintWriter) {
3832
out.println("""
3933
open class Add {
4034
@Param("10000", "100000")
4135
var size: Int = 0
4236
4337
@Benchmark
44-
fun addLast(): ${impl.listType("String")} {
38+
fun addLast(): ${impl.type()} {
4539
return persistentListAdd(size)
4640
}
4741
@@ -57,7 +51,7 @@ open class Add {
5751
fun addLastAndGet(bh: Blackhole) {
5852
val list = persistentListAdd(size)
5953
for (i in 0 until size) {
60-
bh.consume(list.${impl.getOperation}(i))
54+
bh.consume(${impl.getOperation("list", "i")})
6155
}
6256
}
6357
}

benchmarks-libraries/src/main/kotlin/generators/immutableList/getGenerator.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,22 @@ package generators.immutableList
1919
import generators.BenchmarkSourceGenerator
2020
import java.io.PrintWriter
2121

22-
interface ListGetBenchmark {
23-
val packageName: String
24-
fun emptyOf(T: String): String
25-
val getOperation: String
26-
}
27-
28-
class ListGetBenchmarkGenerator(private val impl: ListGetBenchmark) : BenchmarkSourceGenerator() {
29-
override val outputFileName: String = "Get"
22+
class ListGetBenchmarkGenerator(private val impl: ListImplementation) : BenchmarkSourceGenerator() {
23+
override val outputFileName: String get() = "Get"
3024

3125
override fun getPackage(): String {
3226
return super.getPackage() + ".immutableList." + impl.packageName
3327
}
3428

35-
override val imports: Set<String> = super.imports + "org.openjdk.jmh.infra.Blackhole"
29+
override val imports: Set<String> get() = super.imports + "org.openjdk.jmh.infra.Blackhole"
3630

37-
override fun generateBody(out: PrintWriter) {
31+
override fun generateBenchmark(out: PrintWriter) {
3832
out.println("""
3933
open class Get {
4034
@Param("10000", "100000")
4135
var size: Int = 0
4236
43-
private var persistentList = ${impl.emptyOf("String")}
37+
private var persistentList = ${impl.empty()}
4438
4539
@Setup(Level.Trial)
4640
fun prepare() {
@@ -50,7 +44,7 @@ open class Get {
5044
@Benchmark
5145
fun getByIndex(bh: Blackhole) {
5246
for (i in 0 until size) {
53-
bh.consume(persistentList.${impl.getOperation}(i))
47+
bh.consume(${impl.getOperation("persistentList", "i")})
5448
}
5549
}
5650
}

benchmarks-libraries/src/main/kotlin/generators/immutableList/impl/clojure.kt

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,26 @@ package generators.immutableList.impl
1818

1919
import generators.immutableList.*
2020

21-
class ListClojureBenchmark:
22-
ListAddBenchmark,
23-
ListGetBenchmark,
24-
ListIterateBenchmark,
25-
ListRemoveBenchmark,
26-
ListSetBenchmark,
27-
ListBenchmarkUtils
28-
{
21+
object ClojureListImplementation: ListImplementation {
2922
override val packageName: String = "clojure"
3023

31-
override fun listType(T: String): String = "clojure.lang.PersistentVector"
24+
override fun type(): String = "clojure.lang.PersistentVector"
25+
override fun empty(): String = "clojure.lang.PersistentVector.EMPTY"
3226

33-
override fun emptyOf(T: String): String = "clojure.lang.PersistentVector.EMPTY"
27+
override fun getOperation(list: String, index: String): String
28+
= "$list.get($index)"
29+
override fun setOperation(list: String, index: String, newValue: String): String
30+
= "$list.assocN($index, $newValue)"
31+
override fun addOperation(list: String, element: String): String
32+
= "$list.cons($element)"
33+
override fun removeLastOperation(list: String): String
34+
= "$list.pop()"
3435

35-
override fun addOperation(list: String, T: String, element: String): String = "$list.cons($element)"
36-
37-
override fun removeAtOperation(list: String): String = "pop()"
38-
39-
override val getOperation: String = "get"
40-
41-
override val setOperation: String = "assocN"
42-
43-
override fun iterateLastToFirst(list: String): String {
36+
override fun iterateLastToFirst(list: String, size: String): String {
4437
return """
4538
@Benchmark
4639
fun lastToFirst(bh: Blackhole) {
47-
val iterator = $list.listIterator(size)
40+
val iterator = $list.listIterator($size)
4841
4942
while (iterator.hasPrevious()) {
5043
bh.consume(iterator.previous())

benchmarks-libraries/src/main/kotlin/generators/immutableList/impl/cyclops.kt

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,22 @@ package generators.immutableList.impl
1818

1919
import generators.immutableList.*
2020

21-
class ListCyclopsBenchmark:
22-
ListAddBenchmark,
23-
ListGetBenchmark,
24-
ListIterateBenchmark,
25-
ListRemoveBenchmark,
26-
ListSetBenchmark,
27-
ListBenchmarkUtils
28-
{
21+
object CyclopsListImplementation: ListImplementation {
2922
override val packageName: String = "cyclops"
3023

31-
override fun listType(T: String): String = "cyclops.data.Vector<$T>"
24+
override fun type(): String = "cyclops.data.Vector<$listElementType>"
25+
override fun empty(): String = "cyclops.data.Vector.empty<$listElementType>()"
3226

33-
override fun emptyOf(T: String): String = "cyclops.data.Vector.empty<$T>()"
27+
override fun getOperation(list: String, index: String): String
28+
= "$list.get($index)"
29+
override fun setOperation(list: String, index: String, newValue: String): String
30+
= "$list.updateAt($index, $newValue)"
31+
override fun addOperation(list: String, element: String): String
32+
= "$list.plus($element)"
33+
override fun removeLastOperation(list: String): String
34+
= "$list.dropRight(1)"
3435

35-
override fun addOperation(list: String, T: String, element: String): String = "$list.plus($element)"
36-
37-
override fun removeAtOperation(list: String): String = "dropRight(1)"
38-
39-
override val getOperation: String = "get"
40-
41-
override val setOperation: String = "updateAt"
42-
43-
override fun iterateLastToFirst(list: String): String {
36+
override fun iterateLastToFirst(list: String, size: String): String {
4437
return """
4538
@Benchmark
4639
fun lastToFirst(bh: Blackhole) {

benchmarks-libraries/src/main/kotlin/generators/immutableList/impl/kotlin.kt

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,26 @@ package generators.immutableList.impl
1818

1919
import generators.immutableList.*
2020

21-
class ListKotlinBenchmark:
22-
ListAddBenchmark,
23-
ListGetBenchmark,
24-
ListIterateBenchmark,
25-
ListRemoveBenchmark,
26-
ListSetBenchmark,
27-
ListBenchmarkUtils
28-
{
21+
object KotlinListImplementation: ListImplementation {
2922
override val packageName: String = "kotlin"
3023

31-
override fun listType(T: String): String = "kotlinx.collections.immutable.PersistentList<$T>"
24+
override fun type(): String = "kotlinx.collections.immutable.PersistentList<$listElementType>"
25+
override fun empty(): String = "kotlinx.collections.immutable.persistentListOf<$listElementType>()"
3226

33-
override fun emptyOf(T: String): String = "kotlinx.collections.immutable.persistentListOf<$T>()"
27+
override fun getOperation(list: String, index: String): String
28+
= "$list.get($index)"
29+
override fun setOperation(list: String, index: String, newValue: String): String
30+
= "$list.set($index, $newValue)"
31+
override fun addOperation(list: String, element: String): String
32+
= "$list.add($element)"
33+
override fun removeLastOperation(list: String): String
34+
= "$list.removeAt($list.size - 1)"
3435

35-
override fun addOperation(list: String, T: String, element: String): String = "$list.add($element)"
36-
37-
override fun removeAtOperation(list: String): String = "removeAt($list.size - 1)"
38-
39-
override val getOperation: String = "get"
40-
41-
override val setOperation: String = "set"
42-
43-
override fun iterateLastToFirst(list: String): String {
36+
override fun iterateLastToFirst(list: String, size: String): String {
4437
return """
4538
@Benchmark
4639
fun lastToFirst(bh: Blackhole) {
47-
val iterator = $list.listIterator(size)
40+
val iterator = $list.listIterator($size)
4841
4942
while (iterator.hasPrevious()) {
5043
bh.consume(iterator.previous())

0 commit comments

Comments
 (0)