これは実行時間を把握するための理想的な方法ではないかもしれませんが、私は基本的に私がここでやろうとしていますが、最も古いPerson
を見つけて、それが要した時間をプリントアウトされ、この次のコードスニペットstream.max()はstream.reduce()よりも常に高速ですか?
// List of persons with name and age
List<Person> persons = new ArrayList<>();
// Adding 10,000 objects
for(int i = 0 ; i < 10000 ; i ++) {
Person p = new Person();
p.setName("Person " + i);
p.setAge(i);
persons.add(p);
}
long time1 = System.nanoTime();
System.out.println("Time before steram.reduce()" + time1);
Optional<Person> o1 = Optional<Person> o1 = persons.stream().reduce(BinaryOperator.maxBy(Comparator.comparingInt(p -> p.getAge())));
long time2 = System.nanoTime();
System.out.println(o1.get() + "\nTime after stream.reduce() " + time2);
System.out.println("**** Rough execution time for stream.reduce() : " + (time2 - time1) + " nano secs");
long time3 = System.nanoTime();
System.out.println("Time before stream.max() " + time3);
Optional<Person> o2 = persons.stream().max((p01, p02) -> p01.getAge() - p02.getAge());
long time4 = System.nanoTime();
System.out.println(o2.get() + "\nTime after stream.max() " + time4);
System.out.println("**** Rough execution time for stream.max() : " + (time4 - time3) + " nano secs");
を持っていますstream.reduce()
とstream.max()
を使って調べてください。
出力
Time before steram.reduce()8834253431112
[ Person 9999, 9999]
Time after stream.reduce() 8834346269743
**** Rough execution time for stream.reduce() : 92838631 nano secs
Time before stream.max() 8834346687875
[ Person 9999, 9999]
Time after stream.max() 8834350117000
**** Rough execution time for stream.max() : 3429125 nano secs
P.S.私はstream.max()
とstream.reduce()
の順番を変えてこのコードを複数回実行し、stream.max()
よりも出力を生成するのにかなり時間がかかります。
だからstream.max()
常にstream.reduce()
より速いですか?はいの場合は、いつstream.reduce()
を使用しますか?
前の時間と後の時間を比較すると、結果はより読みやすくなります。 –
正確なベンチマークは実際には構築が難しいです。たとえば、比較したスニペットの順序を変更してみてください(最初に最大値にしてから減らしてください)。違いが見られるかもしれません。とにかく、maxははるかに読みやすいIMHOですので、私は最大限に行くでしょう。そして後でそれが実際に分かるならば、ソフトウェアのパフォーマンスを全体的に向上させることは間違いありません。しかし、最初にプロファイリングしてから最適化します;) – sp00m
'new Date()。getTime()'は、System.currentTimeMillis()を取得する厄介な方法です。しかし、「System.nanoTime()」を使って経過時間を測定するか、「Javaで正しいマイクロベンチマークを書くにはどうすればよいですか?」(https://stackoverflow.com/questions/504103/how- i-write-a-correct-micro-benchmark-in-java) – Holger