私は以下の匿名内部クラスに対してラムダのパフォーマンスをテストするためにJMHを使用しているが、私はそれをやった方法です:私はより速く完了するためにラムダを期待していたが、私は以下の反対の結果を得るラムダ式のパフォーマンスをテストする正しい方法は?
public class LambdaVsAnonymousClass {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void testLambda() {
// nonCapturing expressions
NonCapturing nonCapturing =() -> System.out.println("ram");
nonCapturing.test();
// nonCapturing expressions
NonCapturing nonCapturing2 =() -> System.out.println("bon");
nonCapturing2.test();
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void testAnonymousClass() {
// anonymous classes
NonCapturing nonCapturing = new NonCapturing() {
@Override
public void test() {
System.out.println("ram");
}
};
nonCapturing.test();
// anonymous classes
NonCapturing nonCapturing2 = new NonCapturing() {
@Override
public void test() {
System.out.println("bon");
}
};
nonCapturing2.test();
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void testLambdaCapturing() {
// lambda expressions
final int i = 1;
Capturing capturing = n -> System.out.println(n);
capturing.test(i);
// lambda expressions
final int j = 2;
Capturing capturing2 = n -> System.out.println(n);
capturing2.test(j);
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public void testAnonymousClassCapturing() {
// anonymous classes
final int i = 1;
Capturing capturing = new Capturing() {
@Override
public void test(int n) {
System.out.println(n);
}
};
capturing.test(i);
// anonymous classes
final int j = 2;
Capturing capturing2 = new Capturing() {
@Override
public void test(int n) {
System.out.println(n);
}
};
capturing2.test(j);
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(LambdaVsAnonymousClass.class.getSimpleName())
.warmupIterations(5)
.measurementIterations(5)
.forks(1)
.build();
new Runner(opt).run();
}
}
@FunctionalInterface
interface NonCapturing {
void test();
}
@FunctionalInterface
interface Capturing {
void test(int n);
}
。間違ってテストしていますか?もしそうなら、ラムダ式のより高速なパフォーマンスを実際にテストする正しい方法は何でしょうか。
# Run complete. Total time: 00:00:42
Benchmark Mode Cnt Score Error Units
LambdaVsAnonymousClass.testAnonymousClass avgt 5 16.592 ± 4.084 us/op
LambdaVsAnonymousClass.testAnonymousClassCapturing avgt 5 18.916 ± 4.469 us/op
LambdaVsAnonymousClass.testLambda avgt 5 18.618 ± 4.060 us/op
LambdaVsAnonymousClass.testLambdaCapturing avgt 5 22.008 ± 16.729 us/op
注:ラムダ式を取り込むの概念が間違ってコードに示されています。 @Holgerのコメントを読んで理解してください。
コンソール/ osがパフォーマンスに非常に大きな影響を与え、結果を歪める可能性があるため、ベンチマーク中にコンソール( 'System.out.println()')に印刷しないようにしたいと思います。 – Thomas
[Oracleのパフォーマンス・テスト](http://www.oracle.com/technetwork/java/jvmls2013kuksen-2014088.pdf)をご覧ください。 – Flown
_write_ JMHのパフォーマンスエキスパートが十分でない限り、私の助言は次のようなものです:ナノパフォーマンスに関する懸念を止め、代わりに明確なコードを書くことに集中してください。彼らは十分に速いです。 –