Rumah >Java >javaTutorial >Adakah Strim Sentiasa Lebih Lambat Daripada Koleksi Tradisional untuk Operasi Mudah?
Prestasi Java 8 Stream Lwn. Koleksi Tradisional
Baru-baru ini anda telah meneroka Java 8 dan menjalankan penanda aras tidak formal untuk membandingkan prestasi API Strimnya dengan Koleksi klasik. Ujian anda melibatkan penapisan senarai integer, mengekstrak punca kuasa dua nombor genap dan menyimpan keputusan dalam senarai Berganda. Walau bagaimanapun, anda mempersoalkan kesahihan ujian anda dan tidak sabar-sabar untuk menjelaskan implikasi prestasi sebenar.
Menilai Ujian Penanda Aras
Keputusan awal anda, yang menunjukkan aliran menjadi lebih perlahan daripada kutipan, menimbulkan kebimbangan. Untuk memastikan penilaian yang lebih dipercayai, adalah penting untuk menangani kemungkinan ralat dan menjalankan ujian yang adil. Berikut ialah beberapa pertimbangan:
Hasil Penandaarasan yang Betul
Mengikut pengesyoran ini, mari kita semak semula penilaian prestasi menggunakan JMH dan strategi penandaarasan yang lebih baik:
@OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) @OperationsPerInvocation(StreamVsVanilla.N) public class StreamVsVanilla { public static final int N = 10000; static List<Integer> sourceList = new ArrayList<>(); static { for (int i = 0; i < N; i++) { sourceList.add(i); } } @Benchmark public List<Double> vanilla() { List<Double> result = new ArrayList<>(sourceList.size() / 2 + 1); for (Integer i : sourceList) { if (i % 2 == 0){ result.add(Math.sqrt(i)); } } return result; } @Benchmark public List<Double> stream() { return sourceList.stream() .filter(i -> i % 2 == 0) .map(Math::sqrt) .collect(Collectors.toCollection( () -> new ArrayList<>(sourceList.size() / 2 + 1))); } }
Keputusan:
Benchmark Mode Samples Mean Mean error Units StreamVsVanilla.stream avgt 10 17.588 0.230 ns/op StreamVsVanilla.vanilla avgt 10 10.796 0.063 ns/op
Penemuan
Bertentangan dengan keputusan awal, penanda aras JMH jelas menunjukkan bahawa pendekatan pengumpulan tradisional adalah jauh lebih pantas daripada pendekatan aliran dalam senario tertentu ini.
Kesimpulan
Berdasarkan penanda aras yang lebih baik ini hasil, kita boleh membuat kesimpulan bahawa:
Atas ialah kandungan terperinci Adakah Strim Sentiasa Lebih Lambat Daripada Koleksi Tradisional untuk Operasi Mudah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!