153 lines
4.5 KiB
Plaintext
153 lines
4.5 KiB
Plaintext
import groovy.xml.XmlParser
|
|
|
|
plugins {
|
|
kotlin("multiplatform")
|
|
id("org.jetbrains.kotlinx.benchmark")
|
|
id("io.morethan.jmhreport")
|
|
id("de.undercouch.download")
|
|
}
|
|
|
|
group = "com.google.flatbuffers.jmh"
|
|
version = "2.0.0-SNAPSHOT"
|
|
|
|
// Reads latest version from Java's runtime pom.xml,
|
|
// so we can use it for benchmarking against Kotlin's
|
|
// runtime
|
|
fun readJavaFlatBufferVersion(): String {
|
|
val pom = XmlParser().parse(File("../java/pom.xml"))
|
|
val versionTag = pom.children().find {
|
|
val node = it as groovy.util.Node
|
|
node.name().toString().contains("version")
|
|
} as groovy.util.Node
|
|
return versionTag.value().toString()
|
|
}
|
|
|
|
// This plugin generates a static html page with the aggregation
|
|
// of all benchmarks ran. very useful visualization tool.
|
|
jmhReport {
|
|
val baseFolder = project.file("build/reports/benchmarks/main").absolutePath
|
|
val lastFolder = project.file(baseFolder).list()?.sortedArray()?.lastOrNull() ?: ""
|
|
jmhResultPath = "$baseFolder/$lastFolder/jvm.json"
|
|
jmhReportOutput = "$baseFolder/$lastFolder"
|
|
}
|
|
|
|
// For now we benchmark on JVM only
|
|
benchmark {
|
|
configurations {
|
|
this.getByName("main") {
|
|
iterations = 5
|
|
iterationTime = 300
|
|
iterationTimeUnit = "ms"
|
|
// uncomment for benchmarking JSON op only
|
|
include(".*FlatbufferBenchmark.*")
|
|
}
|
|
}
|
|
targets {
|
|
register("jvm")
|
|
}
|
|
}
|
|
|
|
kotlin {
|
|
jvm {
|
|
compilations {
|
|
val main by getting { }
|
|
// custom benchmark compilation
|
|
val benchmarks by compilations.creating {
|
|
defaultSourceSet {
|
|
dependencies {
|
|
// Compile against the main compilation's compile classpath and outputs:
|
|
implementation(main.compileDependencyFiles + main.output.classesDirs)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sourceSets {
|
|
val jvmMain by getting {
|
|
dependencies {
|
|
implementation(kotlin("stdlib-common"))
|
|
implementation(project(":flatbuffers-kotlin"))
|
|
implementation(libs.kotlinx.benchmark.runtime)
|
|
// json serializers
|
|
implementation(libs.moshi.kotlin)
|
|
implementation(libs.gson)
|
|
}
|
|
kotlin.srcDir("src/jvmMain/generated/kotlin/")
|
|
kotlin.srcDir("src/jvmMain/generated/java/")
|
|
kotlin.srcDir("../../java/src/main/java")
|
|
}
|
|
}
|
|
}
|
|
|
|
// This task download all JSON files used for benchmarking
|
|
tasks.register<de.undercouch.gradle.tasks.download.Download>("downloadMultipleFiles") {
|
|
// We are downloading json benchmark samples from serdes-rs project.
|
|
// see: https://github.com/serde-rs/json-benchmark/blob/master/data
|
|
val baseUrl = "https://github.com/serde-rs/json-benchmark/raw/master/data/"
|
|
src(listOf("$baseUrl/canada.json", "$baseUrl/twitter.json", "$baseUrl/citm_catalog.json"))
|
|
dest(File("${project.projectDir.absolutePath}/src/jvmMain/resources"))
|
|
overwrite(false)
|
|
}
|
|
|
|
abstract class GenerateFBTestClasses : DefaultTask() {
|
|
@get:InputFiles
|
|
abstract val inputFiles: ConfigurableFileCollection
|
|
|
|
@get:Input
|
|
abstract val includeFolder: Property<String>
|
|
|
|
@get:Input
|
|
abstract val outputFolder: Property<String>
|
|
|
|
@get:Input
|
|
abstract val variants: ListProperty<String>
|
|
|
|
@Inject
|
|
protected open fun getExecActionFactory(): org.gradle.process.internal.ExecActionFactory? {
|
|
throw UnsupportedOperationException()
|
|
}
|
|
|
|
init {
|
|
includeFolder.set("")
|
|
}
|
|
|
|
@TaskAction
|
|
fun compile() {
|
|
val execAction = getExecActionFactory()!!.newExecAction()
|
|
val sources = inputFiles.asPath.split(":")
|
|
val langs = variants.get().map { "--$it" }
|
|
val args = mutableListOf("flatc","-o", outputFolder.get(), *langs.toTypedArray())
|
|
if (includeFolder.get().isNotEmpty()) {
|
|
args.add("-I")
|
|
args.add(includeFolder.get())
|
|
}
|
|
args.addAll(sources)
|
|
println(args)
|
|
execAction.commandLine = args
|
|
print(execAction.execute())
|
|
}
|
|
}
|
|
|
|
// Use the default greeting
|
|
tasks.register<GenerateFBTestClasses>("generateFBTestClassesKt") {
|
|
inputFiles.setFrom("$projectDir/monster_test_kotlin.fbs")
|
|
includeFolder.set("$rootDir/../tests/include_test")
|
|
outputFolder.set("${projectDir}/src/jvmMain/generated/kotlin/")
|
|
variants.addAll("kotlin-kmp")
|
|
}
|
|
|
|
tasks.register<GenerateFBTestClasses>("generateFBTestClassesJava") {
|
|
inputFiles.setFrom("$projectDir/monster_test_java.fbs")
|
|
includeFolder.set("$rootDir/../tests/include_test")
|
|
outputFolder.set("${projectDir}/src/jvmMain/generated/java/")
|
|
variants.addAll("kotlin")
|
|
}
|
|
|
|
project.tasks.forEach {
|
|
if (it.name.contains("compileKotlin")) {
|
|
it.dependsOn("generateFBTestClassesKt")
|
|
it.dependsOn("generateFBTestClassesJava")
|
|
}
|
|
}
|