1 import groovy.xml.XmlParser 2 <lambda>null3plugins { 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 readJavaFlatBufferVersionnull16fun 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>null27jmhReport { 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>null35benchmark { 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>null50kotlin { 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>null84tasks.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>null133tasks.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>null140tasks.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>null147project.tasks.forEach { 148 if (it.name.contains("compileKotlin")) { 149 it.dependsOn("generateFBTestClassesKt") 150 it.dependsOn("generateFBTestClassesJava") 151 } 152 } 153