• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 import groovy.xml.XmlParser
2 
<lambda>null3 plugins {
4   kotlin("multiplatform")
5   id("org.jetbrains.kotlinx.benchmark")
6   id("io.morethan.jmhreport")
7   id("de.undercouch.download")
8 }
9 
10 group = "com.google.flatbuffers.jmh"
11 version = "2.0.0-SNAPSHOT"
12 
13 // Reads latest version from Java's runtime pom.xml,
14 // so we can use it for benchmarking against Kotlin's
15 // runtime
readJavaFlatBufferVersionnull16 fun readJavaFlatBufferVersion(): String {
17   val pom = XmlParser().parse(File("../java/pom.xml"))
18   val versionTag = pom.children().find {
19     val node = it as groovy.util.Node
20     node.name().toString().contains("version")
21   } as groovy.util.Node
22   return versionTag.value().toString()
23 }
24 
25 // This plugin generates a static html page with the aggregation
26 // of all benchmarks ran. very useful visualization tool.
<lambda>null27 jmhReport {
28   val baseFolder = project.file("build/reports/benchmarks/main").absolutePath
29   val lastFolder = project.file(baseFolder).list()?.sortedArray()?.lastOrNull() ?: ""
30   jmhResultPath = "$baseFolder/$lastFolder/jvm.json"
31   jmhReportOutput = "$baseFolder/$lastFolder"
32 }
33 
34 // For now we benchmark on JVM only
<lambda>null35 benchmark {
36   configurations {
37     this.getByName("main") {
38       iterations = 5
39       iterationTime = 300
40       iterationTimeUnit = "ms"
41       // uncomment for benchmarking JSON op only
42        include(".*FlatbufferBenchmark.*")
43     }
44   }
45   targets {
46     register("jvm")
47   }
48 }
49 
<lambda>null50 kotlin {
51   jvm {
52     compilations {
53       val main by getting { }
54       // custom benchmark compilation
55       val benchmarks by compilations.creating {
56         defaultSourceSet {
57           dependencies {
58             // Compile against the main compilation's compile classpath and outputs:
59             implementation(main.compileDependencyFiles + main.output.classesDirs)
60           }
61         }
62       }
63     }
64   }
65 
66   sourceSets {
67     val jvmMain by getting {
68       dependencies {
69         implementation(kotlin("stdlib-common"))
70         implementation(project(":flatbuffers-kotlin"))
71         implementation(libs.kotlinx.benchmark.runtime)
72         // json serializers
73         implementation(libs.moshi.kotlin)
74         implementation(libs.gson)
75       }
76       kotlin.srcDir("src/jvmMain/generated/kotlin/")
77       kotlin.srcDir("src/jvmMain/generated/java/")
78       kotlin.srcDir("../../java/src/main/java")
79     }
80   }
81 }
82 
83 // This task download all JSON files used for benchmarking
<lambda>null84 tasks.register<de.undercouch.gradle.tasks.download.Download>("downloadMultipleFiles") {
85   // We are downloading json benchmark samples from serdes-rs project.
86   // see: https://github.com/serde-rs/json-benchmark/blob/master/data
87   val baseUrl = "https://github.com/serde-rs/json-benchmark/raw/master/data/"
88   src(listOf("$baseUrl/canada.json", "$baseUrl/twitter.json", "$baseUrl/citm_catalog.json"))
89   dest(File("${project.projectDir.absolutePath}/src/jvmMain/resources"))
90   overwrite(false)
91 }
92 
93 abstract class GenerateFBTestClasses : DefaultTask() {
94   @get:InputFiles
95   abstract val inputFiles: ConfigurableFileCollection
96 
97   @get:Input
98   abstract val includeFolder: Property<String>
99 
100   @get:Input
101   abstract val outputFolder: Property<String>
102 
103   @get:Input
104   abstract val variants: ListProperty<String>
105 
106   @Inject
getExecActionFactorynull107   protected open fun getExecActionFactory(): org.gradle.process.internal.ExecActionFactory? {
108     throw UnsupportedOperationException()
109   }
110 
111   init {
112     includeFolder.set("")
113   }
114 
115   @TaskAction
compilenull116   fun compile() {
117     val execAction = getExecActionFactory()!!.newExecAction()
118     val sources = inputFiles.asPath.split(":")
119     val langs = variants.get().map { "--$it" }
120     val args = mutableListOf("flatc","-o", outputFolder.get(), *langs.toTypedArray())
121     if (includeFolder.get().isNotEmpty()) {
122       args.add("-I")
123       args.add(includeFolder.get())
124     }
125     args.addAll(sources)
126     println(args)
127     execAction.commandLine = args
128     print(execAction.execute())
129   }
130 }
131 
132 // Use the default greeting
<lambda>null133 tasks.register<GenerateFBTestClasses>("generateFBTestClassesKt") {
134   inputFiles.setFrom("$projectDir/monster_test_kotlin.fbs")
135   includeFolder.set("$rootDir/../tests/include_test")
136   outputFolder.set("${projectDir}/src/jvmMain/generated/kotlin/")
137   variants.addAll("kotlin-kmp")
138 }
139 
<lambda>null140 tasks.register<GenerateFBTestClasses>("generateFBTestClassesJava") {
141   inputFiles.setFrom("$projectDir/monster_test_java.fbs")
142   includeFolder.set("$rootDir/../tests/include_test")
143   outputFolder.set("${projectDir}/src/jvmMain/generated/java/")
144   variants.addAll("kotlin")
145 }
146 
<lambda>null147 project.tasks.forEach {
148   if (it.name.contains("compileKotlin")) {
149     it.dependsOn("generateFBTestClassesKt")
150     it.dependsOn("generateFBTestClassesJava")
151   }
152 }
153