Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit 7a1ae61

Browse files
authored
Merge pull request #8 from k163377/fixes_and_add_benchmarks
Fixes and add Benchmarks.
2 parents 54f4927 + b00b6bf commit 7a1ae61

File tree

8 files changed

+62
-22
lines changed

8 files changed

+62
-22
lines changed

src/jmh/kotlin/com/mapk/fastkfunction/benchmarktargets/5.kt renamed to src/jmh/kotlin/com/mapk/fastkfunction/fastkfunction/BenchmarkTargets.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.mapk.fastkfunction.benchmarktargets
1+
package com.mapk.fastkfunction.fastkfunction
22

33
data class Constructor5(
44
val arg1: Int,

src/jmh/kotlin/com/mapk/fastkfunction/CallConstructorBenchmark.kt renamed to src/jmh/kotlin/com/mapk/fastkfunction/fastkfunction/CallConstructorBenchmark.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.mapk.fastkfunction
1+
package com.mapk.fastkfunction.fastkfunction
22

3+
import com.mapk.fastkfunction.FastKFunction
34
import com.mapk.fastkfunction.argumentbucket.ArgumentBucket
4-
import com.mapk.fastkfunction.benchmarktargets.Constructor5
55
import org.openjdk.jmh.annotations.Benchmark
66
import org.openjdk.jmh.annotations.Scope
77
import org.openjdk.jmh.annotations.State
@@ -17,6 +17,7 @@ open class CallConstructorBenchmark {
1717

1818
private val javaConstructor: Constructor<Constructor5> = function.javaConstructor!!
1919
private val fastKFunction: FastKFunction<Constructor5> = FastKFunction.of(function, null)
20+
private val collection: Collection<Int> = listOf(1, 2, 3, 4, 5)
2021
private val argumentBucket: ArgumentBucket = fastKFunction.generateBucket()
2122
.apply { (0 until 5).forEach { this[it] = it + 1 } }
2223

@@ -35,6 +36,9 @@ open class CallConstructorBenchmark {
3536
@Benchmark
3637
fun fastKFunctionCall(): Constructor5 = fastKFunction.call(1, 2, 3, 4, 5)
3738

39+
@Benchmark
40+
fun fastKFunctionCallByCollection(): Constructor5 = fastKFunction.callByCollection(collection)
41+
3842
@Benchmark
3943
fun fastKFunctionCallBy(): Constructor5 = fastKFunction.callBy(argumentBucket)
4044
}

src/jmh/kotlin/com/mapk/fastkfunction/CallInstanceMethodBenchmark.kt renamed to src/jmh/kotlin/com/mapk/fastkfunction/fastkfunction/CallInstanceMethodBenchmark.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.mapk.fastkfunction
1+
package com.mapk.fastkfunction.fastkfunction
22

3+
import com.mapk.fastkfunction.FastKFunction
34
import com.mapk.fastkfunction.argumentbucket.ArgumentBucket
4-
import com.mapk.fastkfunction.benchmarktargets.Constructor5
55
import org.openjdk.jmh.annotations.Benchmark
66
import org.openjdk.jmh.annotations.Scope
77
import org.openjdk.jmh.annotations.State
@@ -19,6 +19,7 @@ open class CallInstanceMethodBenchmark {
1919
private val javaMethod: Method = function.javaMethod!!
2020
private val fastKFunctionWithoutInstance: FastKFunction<Constructor5> = FastKFunction.of(function, null)
2121
private val fastKFunctionWithInstance: FastKFunction<Constructor5> = FastKFunction.of(function, instance)
22+
private val collection: Collection<Int> = listOf(1, 2, 3, 4, 5)
2223
private val argumentBucket: ArgumentBucket = fastKFunctionWithoutInstance.generateBucket()
2324
.apply { (0 until 5).forEach { this[it] = it + 1 } }
2425

@@ -37,12 +38,19 @@ open class CallInstanceMethodBenchmark {
3738
@Benchmark
3839
fun fastKFunctionWithoutInstanceCall(): Constructor5 = fastKFunctionWithoutInstance.call(1, 2, 3, 4, 5)
3940

41+
@Benchmark
42+
fun fastKFunctionWithoutInstanceCallByCollection(): Constructor5 = fastKFunctionWithoutInstance.call(collection)
43+
4044
@Benchmark
4145
fun fastKFunctionWithoutInstanceCallBy(): Constructor5 = fastKFunctionWithoutInstance.callBy(argumentBucket)
4246

4347
@Benchmark
4448
fun fastKFunctionWithInstanceCall(): Constructor5 = fastKFunctionWithInstance.call(1, 2, 3, 4, 5)
4549

50+
@Benchmark
51+
fun fastKFunctionWithInstanceCallByCollection(): Constructor5 =
52+
fastKFunctionWithInstance.callByCollection(collection)
53+
4654
@Benchmark
4755
fun fastKFunctionWithInstanceCallBy(): Constructor5 = fastKFunctionWithInstance.callBy(argumentBucket)
4856
}

src/jmh/kotlin/com/mapk/fastkfunction/CallObjectMethodBenchmark.kt renamed to src/jmh/kotlin/com/mapk/fastkfunction/fastkfunction/CallObjectMethodBenchmark.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.mapk.fastkfunction
1+
package com.mapk.fastkfunction.fastkfunction
22

3+
import com.mapk.fastkfunction.FastKFunction
34
import com.mapk.fastkfunction.argumentbucket.ArgumentBucket
4-
import com.mapk.fastkfunction.benchmarktargets.Constructor5
55
import org.openjdk.jmh.annotations.Benchmark
66
import org.openjdk.jmh.annotations.Scope
77
import org.openjdk.jmh.annotations.State
@@ -36,6 +36,7 @@ open class CallObjectMethodBenchmark {
3636
private val fastKFunctionByReflectionWithInstance: FastKFunction<Constructor5> =
3737
FastKFunction.of(functionByReflection, objectInstance)
3838

39+
private val collection: Collection<Int> = listOf(1, 2, 3, 4, 5)
3940
private val argumentBucket: ArgumentBucket = fastKFunctionByMethodReferenceWithoutInstance.generateBucket()
4041
.apply { (0 until 5).forEach { this[it] = it + 1 } }
4142

@@ -61,6 +62,10 @@ open class CallObjectMethodBenchmark {
6162
fun fastKFunctionByMethodReferenceWithoutInstanceCall(): Constructor5 =
6263
fastKFunctionByMethodReferenceWithoutInstance.call(1, 2, 3, 4, 5)
6364

65+
@Benchmark
66+
fun fastKFunctionByMethodReferenceWithoutInstanceCallByCollection(): Constructor5 =
67+
fastKFunctionByMethodReferenceWithoutInstance.callByCollection(collection)
68+
6469
@Benchmark
6570
fun fastKFunctionByMethodReferenceWithoutInstanceCallBy(): Constructor5 =
6671
fastKFunctionByMethodReferenceWithoutInstance.callBy(argumentBucket)
@@ -69,6 +74,10 @@ open class CallObjectMethodBenchmark {
6974
fun fastKFunctionByMethodReferenceWithInstanceCall(): Constructor5 =
7075
fastKFunctionByMethodReferenceWithInstance.call(1, 2, 3, 4, 5)
7176

77+
@Benchmark
78+
fun fastKFunctionByMethodReferenceWithInstanceCallByCollection(): Constructor5 =
79+
fastKFunctionByMethodReferenceWithInstance.callByCollection(collection)
80+
7281
@Benchmark
7382
fun fastKFunctionByMethodReferenceWithInstanceCallBy(): Constructor5 =
7483
fastKFunctionByMethodReferenceWithInstance.callBy(argumentBucket)
@@ -77,6 +86,10 @@ open class CallObjectMethodBenchmark {
7786
fun fastKFunctionByReflectionWithoutInstanceCall(): Constructor5 =
7887
fastKFunctionByReflectionWithoutInstance.call(1, 2, 3, 4, 5)
7988

89+
@Benchmark
90+
fun fastKFunctionByReflectionWithoutInstanceCallByCollection(): Constructor5 =
91+
fastKFunctionByReflectionWithoutInstance.callByCollection(collection)
92+
8093
@Benchmark
8194
fun fastKFunctionByReflectionWithoutInstanceCallBy(): Constructor5 =
8295
fastKFunctionByReflectionWithoutInstance.callBy(argumentBucket)
@@ -85,6 +98,10 @@ open class CallObjectMethodBenchmark {
8598
fun fastKFunctionByReflectionWithInstanceCall(): Constructor5 =
8699
fastKFunctionByReflectionWithInstance.call(1, 2, 3, 4, 5)
87100

101+
@Benchmark
102+
fun fastKFunctionByReflectionWithInstanceCallByCollection(): Constructor5 =
103+
fastKFunctionByReflectionWithInstance.callByCollection(collection)
104+
88105
@Benchmark
89106
fun fastKFunctionByReflectionWithInstanceCallBy(): Constructor5 =
90107
fastKFunctionByReflectionWithInstance.callBy(argumentBucket)

src/jmh/kotlin/com/mapk/fastkfunction/CallTopLevelExtensionFunBenchmark.kt renamed to src/jmh/kotlin/com/mapk/fastkfunction/fastkfunction/CallTopLevelExtensionFunBenchmark.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
package com.mapk.fastkfunction
1+
package com.mapk.fastkfunction.fastkfunction
22

3+
import com.mapk.fastkfunction.FastKFunction
34
import com.mapk.fastkfunction.argumentbucket.ArgumentBucket
4-
import com.mapk.fastkfunction.benchmarktargets.Constructor5
5-
import com.mapk.fastkfunction.benchmarktargets.topLevelExtensionFun5
65
import org.openjdk.jmh.annotations.Benchmark
76
import org.openjdk.jmh.annotations.Scope
87
import org.openjdk.jmh.annotations.State
@@ -30,6 +29,7 @@ open class CallTopLevelExtensionFunBenchmark {
3029
private val fastKFunctionFromClass: FastKFunction<Constructor5> =
3130
FastKFunction.of(functionFromClass, receiverInstance)
3231

32+
private val collection: Collection<Int> = listOf(1, 2, 3, 4, 5)
3333
private val argumentBucket: ArgumentBucket = fastKFunctionByMethodReferenceWithoutInstance.generateBucket()
3434
.apply { (0 until 5).forEach { this[it] = it + 1 } }
3535

@@ -55,6 +55,10 @@ open class CallTopLevelExtensionFunBenchmark {
5555
fun fastKFunctionByMethodReferenceWithoutInstanceCall(): Constructor5 =
5656
fastKFunctionByMethodReferenceWithoutInstance.call(1, 2, 3, 4, 5)
5757

58+
@Benchmark
59+
fun fastKFunctionByMethodReferenceWithoutInstanceCallByCollection(): Constructor5 =
60+
fastKFunctionByMethodReferenceWithoutInstance.callByCollection(collection)
61+
5862
@Benchmark
5963
fun fastKFunctionByMethodReferenceWithoutInstanceCallBy(): Constructor5 =
6064
fastKFunctionByMethodReferenceWithoutInstance.callBy(argumentBucket)
@@ -63,6 +67,10 @@ open class CallTopLevelExtensionFunBenchmark {
6367
fun fastKFunctionByMethodReferenceWithInstanceCall(): Constructor5 =
6468
fastKFunctionByMethodReferenceWithInstance.call(1, 2, 3, 4, 5)
6569

70+
@Benchmark
71+
fun fastKFunctionByMethodReferenceWithInstanceCallByCollection(): Constructor5 =
72+
fastKFunctionByMethodReferenceWithInstance.callByCollection(collection)
73+
6674
@Benchmark
6775
fun fastKFunctionByMethodReferenceWithInstanceCallBy(): Constructor5 =
6876
fastKFunctionByMethodReferenceWithInstance.callBy(argumentBucket)
@@ -71,6 +79,10 @@ open class CallTopLevelExtensionFunBenchmark {
7179
fun fastKFunctionFromClassCall(): Constructor5 =
7280
fastKFunctionFromClass.call(1, 2, 3, 4, 5)
7381

82+
@Benchmark
83+
fun fastKFunctionFromClassCallByCollection(): Constructor5 =
84+
fastKFunctionFromClass.callByCollection(collection)
85+
7486
@Benchmark
7587
fun fastKFunctionFromClassCallBy(): Constructor5 =
7688
fastKFunctionFromClass.callBy(argumentBucket)

src/jmh/kotlin/com/mapk/fastkfunction/CallTopLevelFunBenchmark.kt renamed to src/jmh/kotlin/com/mapk/fastkfunction/fastkfunction/CallTopLevelFunBenchmark.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
package com.mapk.fastkfunction
1+
package com.mapk.fastkfunction.fastkfunction
22

3+
import com.mapk.fastkfunction.FastKFunction
34
import com.mapk.fastkfunction.argumentbucket.ArgumentBucket
4-
import com.mapk.fastkfunction.benchmarktargets.Constructor5
5-
import com.mapk.fastkfunction.benchmarktargets.topLevelFun5
65
import org.openjdk.jmh.annotations.Benchmark
76
import org.openjdk.jmh.annotations.Scope
87
import org.openjdk.jmh.annotations.State
@@ -18,6 +17,7 @@ open class CallTopLevelFunBenchmark {
1817

1918
private val javaMethod: Method = function.javaMethod!!
2019
private val fastKFunction: FastKFunction<Constructor5> = FastKFunction.of(function, null)
20+
private val collection: Collection<Int> = listOf(1, 2, 3, 4, 5)
2121
private val argumentBucket: ArgumentBucket = fastKFunction.generateBucket()
2222
.apply { (0 until 5).forEach { this[it] = it + 1 } }
2323

@@ -36,6 +36,9 @@ open class CallTopLevelFunBenchmark {
3636
@Benchmark
3737
fun fastKFunctionCall(): Constructor5 = fastKFunction.call(1, 2, 3, 4, 5)
3838

39+
@Benchmark
40+
fun fastKFunctionCallByCollection(): Constructor5 = fastKFunction.callByCollection(collection)
41+
3942
@Benchmark
4043
fun fastKFunctionCallBy(): Constructor5 = fastKFunction.callBy(argumentBucket)
4144
}

src/main/kotlin/com/mapk/fastkfunction/FastKFunction.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,8 @@ sealed class FastKFunction<T> {
160160
method.parameters.size != parameters.size ->
161161
instance
162162
?.let {
163-
val generator = BucketGenerator(parameters, instance)
164-
val valueParameters = parameters.subList(1, parameters.size)
165-
166-
TopLevelExtensionFunction(function, method, instance, generator, valueParameters)
163+
// KFunctionとしては値パラメータを求めていないため、バケツにはインスタンスを設定しない
164+
TopLevelExtensionFunction(function, method, it, BucketGenerator(parameters, null), parameters)
167165
} ?: Function(function, parameters)
168166
// トップレベル関数
169167
else -> TopLevelFunction(function, method, parameters)
@@ -186,9 +184,8 @@ sealed class FastKFunction<T> {
186184
InstanceFunction(function, method, instance, generator, valueParameters)
187185
} else {
188186
instance
189-
?.let {
190-
InstanceFunction(function, method, instance, BucketGenerator(parameters, null), parameters)
191-
} ?: Function(function, parameters)
187+
?.let { InstanceFunction(function, method, it, BucketGenerator(parameters, null), parameters) }
188+
?: Function(function, parameters)
192189
}
193190
}
194191

src/test/kotlin/com/mapk/fastkfunction/fastkfunction/UseDefaultValueCallTest.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import org.junit.jupiter.params.provider.Arguments
99
import org.junit.jupiter.params.provider.MethodSource
1010
import java.util.stream.Stream
1111
import kotlin.reflect.KFunction
12-
import kotlin.reflect.KParameter
1312
import kotlin.reflect.full.companionObject
1413
import kotlin.reflect.full.companionObjectInstance
1514
import kotlin.reflect.full.functions
@@ -109,7 +108,7 @@ private class UseDefaultValueCallTest {
109108
fun test(target: KFunction<Dst>, instance: Any?, default: DefaultValues) {
110109
val sut = FastKFunction.of(target, instance)
111110
val bucket = sut.generateBucket().apply {
112-
val params = target.parameters.filter { it.kind == KParameter.Kind.VALUE && !it.isOptional }
111+
val params = sut.valueParameters
113112

114113
set(params[0], 100)
115114
set(params[1], "txt")

0 commit comments

Comments
 (0)