Several benchmarks for C interop (#2659)
This commit is contained in:
@@ -19,10 +19,10 @@ buildscript {
|
|||||||
|
|
||||||
task konanRun {
|
task konanRun {
|
||||||
subprojects.each {
|
subprojects.each {
|
||||||
dependsOn it.getTasksByName('konanRun', true)[0]
|
dependsOn it.getTasksByName('konanRun', true)[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task jvmRun {
|
task jvmRun {
|
||||||
subprojects.each {
|
subprojects.each {
|
||||||
dependsOn it.getTasksByName('jvmRun', true)[0]
|
dependsOn it.getTasksByName('jvmRun', true)[0]
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
project.ext {
|
||||||
|
applicationName = 'Cinterop'
|
||||||
|
commonSrcDirs = ['../../tools/benchmarks/shared/src', 'src/main/kotlin', '../shared/src/main/kotlin', '../../tools/kliopt']
|
||||||
|
jvmSrcDirs = ['src/main/kotlin-jvm', '../shared/src/main/kotlin-jvm']
|
||||||
|
nativeSrcDirs = ['src/main/kotlin-native', '../shared/src/main/kotlin-native']
|
||||||
|
|
||||||
|
}
|
||||||
|
apply from: rootProject.file('gradle/benchmark.gradle')
|
||||||
|
kotlin.targets.native.compilations.main.cinterops {
|
||||||
|
macros
|
||||||
|
struct
|
||||||
|
types
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
org.jetbrains.kotlin.native.home=../../dist
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.structsBenchmarks
|
||||||
|
|
||||||
|
actual fun structBenchmark() {
|
||||||
|
error("Benchmark structBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
|
actual fun unionBenchmark() {
|
||||||
|
error("Benchmark unionBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
|
actual fun enumBenchmark() {
|
||||||
|
error("Benchmark enumBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.structsProducedByMacrosBenchmarks
|
||||||
|
|
||||||
|
actual fun macrosBenchmark() {
|
||||||
|
error("Benchmark macrosBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.typesBenchmarks
|
||||||
|
|
||||||
|
actual class StringBenchmark actual constructor() {
|
||||||
|
actual fun stringToCBenchmark() {
|
||||||
|
error("Benchmark stringToCBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun stringToKotlinBenchmark() {
|
||||||
|
error("Benchmark stringToKotlinBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual class IntBenchmark actual constructor() {
|
||||||
|
actual fun intBenchmark() {
|
||||||
|
error("Benchmark intBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual class BoxedIntBenchmark actual constructor() {
|
||||||
|
actual fun boxedIntBenchmark() {
|
||||||
|
error("Benchmark boxedIntBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual class IntMatrixBenchmark actual constructor() {
|
||||||
|
actual fun intMatrixBenchmark() {
|
||||||
|
error("Benchmark intMatrixBenchmark is unsupported on JVM!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+80
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.structsBenchmarks
|
||||||
|
import kotlinx.cinterop.*
|
||||||
|
import kotlin.math.sqrt
|
||||||
|
|
||||||
|
const val benchmarkSize = 10000
|
||||||
|
|
||||||
|
actual fun structBenchmark() {
|
||||||
|
memScoped {
|
||||||
|
val containsFunction = staticCFunction<CPointer<ElementS>?, CPointer<ElementS>?, Int> { first, second ->
|
||||||
|
if (first == null || second == null) {
|
||||||
|
0
|
||||||
|
} else if (first.pointed.string.toKString().contains(second.pointed.string.toKString())) {
|
||||||
|
1
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val elementsList = mutableListOf<ElementS>()
|
||||||
|
// Fill list.
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
val element = alloc<ElementS>()
|
||||||
|
element.floatValue = i + sqrt(i.toDouble()).toFloat()
|
||||||
|
element.integer = i.toLong()
|
||||||
|
itoa(i, element.string, 10)
|
||||||
|
element.contains = containsFunction
|
||||||
|
|
||||||
|
elementsList.add(element)
|
||||||
|
}
|
||||||
|
val summary = elementsList.map { multiplyElementS(it.readValue(), (0..10).random()) }
|
||||||
|
.reduce { acc, it -> sumElementSPtr(acc.ptr, it.ptr)!!.pointed.readValue() }
|
||||||
|
val intValue = summary.useContents { integer }
|
||||||
|
elementsList.last().contains!!(elementsList.last().ptr, elementsList.first().ptr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun unionBenchmark() {
|
||||||
|
memScoped {
|
||||||
|
val elementsList = mutableListOf<ElementU>()
|
||||||
|
// Fill list.
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
val element = alloc<ElementU>()
|
||||||
|
element.integer = i.toLong()
|
||||||
|
elementsList.add(element)
|
||||||
|
}
|
||||||
|
elementsList.forEach {
|
||||||
|
it.floatValue = it.integer + sqrt(it.integer.toDouble()).toFloat()
|
||||||
|
}
|
||||||
|
val summary = elementsList.map { multiplyElementU(it.readValue(), (0..10).random()) }
|
||||||
|
.reduce { acc, it -> sumElementUPtr(acc.ptr, it.ptr)!!.pointed.readValue() }
|
||||||
|
summary.useContents { integer }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun enumBenchmark() {
|
||||||
|
val days = arrayOf("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
|
||||||
|
val enumValues = mutableListOf<WeekDay>()
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
enumValues.add(getWeekDay(days[(0..6).random()]))
|
||||||
|
}
|
||||||
|
enumValues.forEach {
|
||||||
|
isWeekEnd(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
+59
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.structsProducedByMacrosBenchmarks
|
||||||
|
import kotlinx.cinterop.*
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
const val benachmarkSize = 1000
|
||||||
|
|
||||||
|
actual fun macrosBenchmark() {
|
||||||
|
memScoped {
|
||||||
|
val ints = new_list_int()
|
||||||
|
for (i in 1..benachmarkSize) {
|
||||||
|
list_push_front_int(ints, i)
|
||||||
|
}
|
||||||
|
val floats = new_list_float()
|
||||||
|
// Copy integer list to float one.
|
||||||
|
ints?.pointed?.apply {
|
||||||
|
var current = _first
|
||||||
|
while(current != null) {
|
||||||
|
list_push_front_float(floats, current?.pointed?._data?.toFloat()
|
||||||
|
?: error("Null elements in list are not expected!")
|
||||||
|
)
|
||||||
|
current = current?.pointed?._next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Reverse list.
|
||||||
|
var previous: CPointer<list_elem_float>? = null
|
||||||
|
var current = floats?.pointed?._first
|
||||||
|
while (current != null) {
|
||||||
|
val next = current?.pointed?._next
|
||||||
|
current?.pointed?._next = previous
|
||||||
|
previous = current
|
||||||
|
current = next
|
||||||
|
}
|
||||||
|
floats?.pointed?._first = previous
|
||||||
|
free_list_int(ints)
|
||||||
|
try {
|
||||||
|
if (abs(list_front_float(floats) - benachmarkSize.toFloat()) > 0.00001) {
|
||||||
|
error("Wrong first element!")
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
free_list_float(floats)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+132
@@ -0,0 +1,132 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.typesBenchmarks
|
||||||
|
|
||||||
|
import kotlin.random.Random
|
||||||
|
import kotlinx.cinterop.*
|
||||||
|
|
||||||
|
const val benchmarkSize = 1000
|
||||||
|
|
||||||
|
actual class StringBenchmark actual constructor() {
|
||||||
|
val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
|
||||||
|
val randomString = generateRandomString()
|
||||||
|
val randomChar = charPool[Random.nextInt(0, charPool.size)]
|
||||||
|
val strings = mutableListOf<String>()
|
||||||
|
|
||||||
|
init {
|
||||||
|
// Generate random strings.
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
strings.add(generateRandomString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun generateRandomString(): String {
|
||||||
|
return (1..benchmarkSize)
|
||||||
|
.map { i -> Random.nextInt(0, charPool.size) }
|
||||||
|
.map(charPool::get)
|
||||||
|
.joinToString("")
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun stringToCBenchmark() {
|
||||||
|
// Generate random strings.
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
charFrequency(randomString, randomChar.toByte())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun stringToKotlinBenchmark() {
|
||||||
|
memScoped {
|
||||||
|
val result = StringBuilder()
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
val pointer = findSuitableString(strings.toCStringArray(this), benchmarkSize, "a")
|
||||||
|
result.append(pointer?.toKString())
|
||||||
|
nativeHeap.free(pointer.rawValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual class IntMatrixBenchmark actual constructor(){
|
||||||
|
val matrixSize = 1000
|
||||||
|
val first = generateMatrix(matrixSize)
|
||||||
|
val second = generateMatrix(matrixSize)
|
||||||
|
|
||||||
|
fun generateMatrix(size: Int): Array<IntArray> {
|
||||||
|
val matrix = Array(size, { IntArray(size) })
|
||||||
|
for (i in (0 until size)) {
|
||||||
|
for (j in (0 until size)) {
|
||||||
|
matrix[i][j] = (1..20).random()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matrix
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun intMatrixBenchmark() {
|
||||||
|
memScoped {
|
||||||
|
val result = allocArray<CPointerVar<IntVar>>(matrixSize)
|
||||||
|
for (i in (0 until matrixSize)) {
|
||||||
|
result[i] = allocArray<IntVar>(matrixSize)
|
||||||
|
}
|
||||||
|
val resultMatrix = multiplyMatrix(matrixSize, matrixSize,
|
||||||
|
first.map { it.toCValues().ptr }.toCValues().ptr,
|
||||||
|
matrixSize, matrixSize,
|
||||||
|
second.map { it.toCValues().ptr }.toCValues().ptr)
|
||||||
|
val resultOutput = buildString {
|
||||||
|
for (i in (0 until matrixSize)) {
|
||||||
|
for (j in (0 until matrixSize)) {
|
||||||
|
append(resultMatrix!![i]!![j])
|
||||||
|
append(" ")
|
||||||
|
}
|
||||||
|
append("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual class IntBenchmark actual constructor() {
|
||||||
|
val size = 20
|
||||||
|
val array = Array<Int>(size, { (0 until size).random() })
|
||||||
|
|
||||||
|
actual fun intBenchmark() {
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
average(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7], array[8],
|
||||||
|
array[9], array[10], array[11], array[12], array[13], array[14], array[15], array[16],
|
||||||
|
array[17], array[18], array[19])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual class BoxedIntBenchmark actual constructor() {
|
||||||
|
val size = 20
|
||||||
|
val array = Array<Int?>(size, { null })
|
||||||
|
|
||||||
|
init {
|
||||||
|
for (i in (0 until size)) {
|
||||||
|
val element: Int? = (0 until size).random()
|
||||||
|
array[i] = element
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
actual fun boxedIntBenchmark() {
|
||||||
|
for (i in 1..benchmarkSize) {
|
||||||
|
average(array[0]!!, array[1]!!, array[2]!!, array[3]!!, array[4]!!, array[5]!!, array[6]!!, array[7]!!, array[8]!!,
|
||||||
|
array[9]!!, array[10]!!, array[11]!!, array[12]!!, array[13]!!, array[14]!!, array[15]!!, array[16]!!,
|
||||||
|
array[17]!!, array[18]!!, array[19]!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import org.jetbrains.structsProducedByMacrosBenchmarks.*
|
||||||
|
import org.jetbrains.benchmarksLauncher.*
|
||||||
|
import org.jetbrains.structsBenchmarks.*
|
||||||
|
import org.jetbrains.typesBenchmarks.*
|
||||||
|
import org.jetbrains.kliopt.*
|
||||||
|
|
||||||
|
class CinteropLauncher(numWarmIterations: Int, numberOfAttempts: Int, prefix: String): Launcher(numWarmIterations, numberOfAttempts, prefix) {
|
||||||
|
val stringBenchmark = StringBenchmark()
|
||||||
|
val intMatrixBenchmark = IntMatrixBenchmark()
|
||||||
|
val intBenchmark = IntBenchmark()
|
||||||
|
val boxedIntBenchmark = BoxedIntBenchmark()
|
||||||
|
override val benchmarks = BenchmarksCollection(
|
||||||
|
mutableMapOf(
|
||||||
|
"macros" to ::macrosBenchmark,
|
||||||
|
"struct" to ::structBenchmark,
|
||||||
|
"union" to ::unionBenchmark,
|
||||||
|
"enum" to ::enumBenchmark,
|
||||||
|
"stringToC" to stringBenchmark::stringToCBenchmark,
|
||||||
|
"stringToKotlin" to stringBenchmark::stringToKotlinBenchmark,
|
||||||
|
"intMatrix" to intMatrixBenchmark::intMatrixBenchmark,
|
||||||
|
"int" to intBenchmark::intBenchmark,
|
||||||
|
"boxedInt" to boxedIntBenchmark::boxedIntBenchmark
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
BenchmarksRunner.runBenchmarks(args, { parser: ArgParser ->
|
||||||
|
CinteropLauncher(parser.get<Int>("warmup")!!, parser.get<Int>("repeat")!!, parser.get<String>("prefix")!!).launch(parser.getAll<String>("filter"))
|
||||||
|
})
|
||||||
|
}
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.structsBenchmarks
|
||||||
|
|
||||||
|
expect fun structBenchmark()
|
||||||
|
expect fun unionBenchmark()
|
||||||
|
expect fun enumBenchmark()
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.structsProducedByMacrosBenchmarks
|
||||||
|
|
||||||
|
expect fun macrosBenchmark()
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.typesBenchmarks
|
||||||
|
|
||||||
|
expect class StringBenchmark() {
|
||||||
|
fun stringToCBenchmark()
|
||||||
|
fun stringToKotlinBenchmark()
|
||||||
|
}
|
||||||
|
expect class IntBenchmark() {
|
||||||
|
fun intBenchmark()
|
||||||
|
}
|
||||||
|
expect class BoxedIntBenchmark() {
|
||||||
|
fun boxedIntBenchmark()
|
||||||
|
}
|
||||||
|
expect class IntMatrixBenchmark() {
|
||||||
|
fun intMatrixBenchmark()
|
||||||
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
package = org.jetbrains.structsProducedByMacrosBenchmarks
|
||||||
|
|
||||||
|
---
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define define_list(type) \
|
||||||
|
\
|
||||||
|
struct _list_##type; \
|
||||||
|
\
|
||||||
|
typedef struct \
|
||||||
|
{ \
|
||||||
|
int (*is_empty)(const struct _list_##type*); \
|
||||||
|
size_t (*size)(const struct _list_##type*); \
|
||||||
|
const type (*front)(const struct _list_##type*); \
|
||||||
|
void (*push_front)(struct _list_##type*, type); \
|
||||||
|
} _list_functions_##type; \
|
||||||
|
\
|
||||||
|
typedef struct _list_elem_##type \
|
||||||
|
{ \
|
||||||
|
type _data; \
|
||||||
|
struct _list_elem_##type* _next; \
|
||||||
|
} list_elem_##type; \
|
||||||
|
\
|
||||||
|
typedef struct _list_##type \
|
||||||
|
{ \
|
||||||
|
size_t _size; \
|
||||||
|
list_elem_##type* _first; \
|
||||||
|
list_elem_##type* _last; \
|
||||||
|
_list_functions_##type* _functions; \
|
||||||
|
} List_##type; \
|
||||||
|
\
|
||||||
|
List_##type* new_list_##type(); \
|
||||||
|
int list_is_empty_##type(const List_##type* list); \
|
||||||
|
size_t list_size_##type(const List_##type* list); \
|
||||||
|
const type list_front_##type(const List_##type* list); \
|
||||||
|
void list_push_front_##type(List_##type* list, type elem); \
|
||||||
|
\
|
||||||
|
int list_is_empty_##type(const List_##type* list) \
|
||||||
|
{ \
|
||||||
|
return list->_size == 0; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
size_t list_size_##type(const List_##type* list) \
|
||||||
|
{ \
|
||||||
|
return list->_size; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
const type list_front_##type(const List_##type* list) \
|
||||||
|
{ \
|
||||||
|
return list->_first->_data; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
void list_push_front_##type(List_##type* list, type elem) \
|
||||||
|
{ \
|
||||||
|
struct _list_elem_##type* element = (struct _list_elem_##type*) malloc(sizeof(struct _list_elem_##type)); \
|
||||||
|
element->_data = elem; \
|
||||||
|
element->_next = list->_first; \
|
||||||
|
list->_first = element; \
|
||||||
|
list->_size++; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
_list_functions_##type _list_funcs_##type = { \
|
||||||
|
&list_is_empty_##type, \
|
||||||
|
&list_size_##type, \
|
||||||
|
&list_front_##type, \
|
||||||
|
&list_push_front_##type, \
|
||||||
|
}; \
|
||||||
|
\
|
||||||
|
List_##type* new_list_##type() \
|
||||||
|
{ \
|
||||||
|
List_##type* res = (List_##type*) malloc(sizeof(List_##type)); \
|
||||||
|
res->_size = 0; \
|
||||||
|
res->_first = NULL; \
|
||||||
|
res->_functions = &_list_funcs_##type; \
|
||||||
|
return res; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
void free_list_##type(List_##type* list) \
|
||||||
|
{ \
|
||||||
|
struct _list_elem_##type* current = list->_first; \
|
||||||
|
while (current != NULL) \
|
||||||
|
{ \
|
||||||
|
struct _list_elem_##type* next = current->_next; \
|
||||||
|
free(current); \
|
||||||
|
current = next; \
|
||||||
|
} \
|
||||||
|
free(list); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
define_list(int)
|
||||||
|
define_list(float)
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
package = org.jetbrains.structsBenchmarks
|
||||||
|
strictEnums = WeekDay
|
||||||
|
|
||||||
|
---
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
enum WeekDay {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
|
||||||
|
|
||||||
|
int isWeekEnd(enum WeekDay day) {
|
||||||
|
if (day == Saturday || day == Sunday)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum WeekDay getWeekDay(const char* date) {
|
||||||
|
if (strstr(date, "Sunday") != NULL) {
|
||||||
|
return Sunday;
|
||||||
|
} else if (strstr(date, "Monday") != NULL) {
|
||||||
|
return Monday;
|
||||||
|
} else if (strstr(date, "Tuesday") != NULL) {
|
||||||
|
return Tuesday;
|
||||||
|
} else if (strstr(date, "Wednesday") != NULL) {
|
||||||
|
return Wednesday;
|
||||||
|
} else if (strstr(date, "Thursday") != NULL) {
|
||||||
|
return Thursday;
|
||||||
|
} else if (strstr(date, "Friday") != NULL) {
|
||||||
|
return Friday;
|
||||||
|
} else if (strstr(date, "Saturday") != NULL) {
|
||||||
|
return Saturday;
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ElementS {
|
||||||
|
long long integer;
|
||||||
|
float floatValue;
|
||||||
|
char string[32];
|
||||||
|
|
||||||
|
int (*contains)(const struct ElementS*, const struct ElementS*);
|
||||||
|
};
|
||||||
|
|
||||||
|
int elementContains(const struct ElementS* self, const struct ElementS* other) {
|
||||||
|
if (self == NULL || other == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (strstr(self->string, other->string) != NULL) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
union ElementU {
|
||||||
|
long long integer;
|
||||||
|
float floatValue;
|
||||||
|
char string[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
union ElementU multiplyElementU(union ElementU element, int coefficient) {
|
||||||
|
union ElementU newElement;
|
||||||
|
newElement.integer = coefficient * element.integer;
|
||||||
|
return newElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ElementS multiplyElementS(struct ElementS element, int coefficient) {
|
||||||
|
struct ElementS newElement;
|
||||||
|
newElement.integer = coefficient * element.integer;
|
||||||
|
newElement.floatValue = coefficient * element.floatValue;
|
||||||
|
int i = 0;
|
||||||
|
while (element.string[i] != '\0') {
|
||||||
|
newElement.string[i] = coefficient * element.string[i];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return newElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
void itoa(int val, char* buffer, int base){
|
||||||
|
int i = 30;
|
||||||
|
for(; val && i ; --i, val /= base)
|
||||||
|
buffer[i] = "0123456789abcdef"[val % base];
|
||||||
|
buffer[31] = '\0';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
union ElementU* sumElementUPtr(const union ElementU* first, const union ElementU* second) {
|
||||||
|
if (first == NULL || second == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
union ElementU* newElement = (union ElementU*)malloc(sizeof(union ElementU));
|
||||||
|
newElement->integer = first->integer + second->integer;
|
||||||
|
return newElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ElementS* sumElementSPtr(const struct ElementS* first, const struct ElementS* second) {
|
||||||
|
if (first == NULL || second == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
struct ElementS* newElement = (struct ElementS*)malloc(sizeof(struct ElementS));
|
||||||
|
newElement->integer = first->integer + second->integer;
|
||||||
|
newElement->floatValue = first->floatValue + second->floatValue;
|
||||||
|
itoa(newElement->integer, newElement->string, 10);
|
||||||
|
return newElement;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package = org.jetbrains.typesBenchmarks
|
||||||
|
|
||||||
|
---
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int charFrequency(const char* string, char charToFind) {
|
||||||
|
int frequency = 0;
|
||||||
|
for(int i = 0; string[i] != '\0'; ++i) {
|
||||||
|
if(charToFind == string[i])
|
||||||
|
++frequency;
|
||||||
|
}
|
||||||
|
return frequency;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* findSuitableString(const char* stringsArray[], int arraySize, const char* stringToFind) {
|
||||||
|
for(int i = 0; i < arraySize; ++i) {
|
||||||
|
if (strstr(stringsArray[i], stringToFind) != NULL) {
|
||||||
|
char* result = (char*) malloc((strlen(stringsArray[i])+1)*sizeof(char));
|
||||||
|
strcpy(result, stringsArray[i]);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long int sum(int array[], int arraySize) {
|
||||||
|
unsigned long int result = 0;
|
||||||
|
for(int i = 0; i < arraySize; ++i) {
|
||||||
|
result += array[i];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
double average(int count, ...) {
|
||||||
|
va_list list;
|
||||||
|
int j = 0;
|
||||||
|
va_start(list, count);
|
||||||
|
double sum = 0;
|
||||||
|
for(j=0; j<count; j++) {
|
||||||
|
sum += va_arg(list, int);
|
||||||
|
}
|
||||||
|
va_end(list);
|
||||||
|
return sum / count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int** multiplyMatrix(int m1, int m2, const int** mat1, int n1, int n2, const int** mat2) {
|
||||||
|
int x, i, j;
|
||||||
|
int **res = (int **)malloc(m1 * sizeof(int *));
|
||||||
|
for (i=0; i<m1; i++) {
|
||||||
|
res[i] = (int *)malloc(n2 * sizeof(int));
|
||||||
|
}
|
||||||
|
for (i = 0; i < m1; i++) {
|
||||||
|
for (j = 0; j < n2; j++) {
|
||||||
|
res[i][j] = 0;
|
||||||
|
for (x = 0; x < m2; x++) {
|
||||||
|
res[i][j] += mat1[i][x] * mat2[x][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
@@ -3,5 +3,6 @@ project.ext {
|
|||||||
commonSrcDirs = ['../../tools/benchmarks/shared/src', 'src/main/kotlin', '../shared/src/main/kotlin', '../../tools/kliopt']
|
commonSrcDirs = ['../../tools/benchmarks/shared/src', 'src/main/kotlin', '../shared/src/main/kotlin', '../../tools/kliopt']
|
||||||
jvmSrcDirs = ['src/main/kotlin-jvm', '../shared/src/main/kotlin-jvm']
|
jvmSrcDirs = ['src/main/kotlin-jvm', '../shared/src/main/kotlin-jvm']
|
||||||
nativeSrcDirs = ['src/main/kotlin-native', '../shared/src/main/kotlin-native']
|
nativeSrcDirs = ['src/main/kotlin-native', '../shared/src/main/kotlin-native']
|
||||||
|
|
||||||
}
|
}
|
||||||
apply from: rootProject.file('gradle/benchmark.gradle')
|
apply from: rootProject.file('gradle/benchmark.gradle')
|
||||||
@@ -1 +1,2 @@
|
|||||||
include ':ring'
|
include ':ring'
|
||||||
|
include ':cinterop'
|
||||||
@@ -21,7 +21,7 @@ import kotlinx.cinterop.*
|
|||||||
import libcurl.*
|
import libcurl.*
|
||||||
|
|
||||||
actual fun readFile(fileName: String): String {
|
actual fun readFile(fileName: String): String {
|
||||||
val file = fopen(fileName, "r") ?: error("Cannot write file '$fileName'")
|
val file = fopen(fileName, "r") ?: error("Cannot read file '$fileName'")
|
||||||
var buffer = ByteArray(1024)
|
var buffer = ByteArray(1024)
|
||||||
var text = StringBuilder()
|
var text = StringBuilder()
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user