Quote:
Originally Posted by C0untLizzi
Warum genau sollte das 1. schneller sein ? Und performance ist nie irrelevant.
|
Ob Performance relevant ist liegt wohl immer noch am jeweiligen Use-Case. Wenn man eine Webanwendung oder ähnliches hat, machen die paar Nanosekunden keinen Unterschied. Da ist Lesbarkeit etc. wichtiger.
Und warum das 1. Programm schneller ist? Vermutlich weil System.arraycopy nativ implementiert ist und was uU deutlich schneller sein kann. Wobei das bei Arrays dieser Größenordnung ohnehin völlig irrelevant ist. Vllt. werden Streams von der JVM auch nicht so gut optimiert oder ähnliches. Du kannst ja mal selbst messen und gucken was schneller ist ;)
Hier mal eine Messung von mir:
PHP Code:
@State(Scope.Thread)
public class Test {
int[] arr1 = new int[]{9, 8, 7, 6, 5};
int[] arr2 = new int[]{4, 3, 2, 1};
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(Test.class.getSimpleName())
.warmupIterations(1000)
.measurementIterations(1000)
.timeUnit(TimeUnit.NANOSECONDS)
.mode(Mode.AverageTime)
.forks(1)
.build();
new Runner(opt).run();
}
//@Benchmark
public int[] streamBenchmark() {
return IntStream.concat(Arrays.stream(arr1), Arrays.stream(arr2)).sorted().toArray();
}
//@Benchmark
public int[] regBenchmark() {
int[] result = new int[arr1.length + arr2.length];
System.arraycopy(arr1, 0, result, 0, arr1.length);
System.arraycopy(arr2, 0, result, arr1.length, arr2.length);
Arrays.sort(result);
return result;
}
}
Mit dem Ergebnis:
Code:
Benchmark Mode Cnt Score Error Units
Test.regBenchmark avgt 1000 79,475 ± 1,531 ns/op
Test.streamBenchmark avgt 1000 188,236 ± 1,402 ns/op
Und damit siehst du auch, dass sich meine Vermutung bestätigt hat. Streams sind fast immer langsamer als vergleichbare Collections Iterationen oder Ähnliches.