Rumah  >  Artikel  >  Java  >  Adakah Strim Sentiasa Lebih Lambat Daripada Koleksi Tradisional untuk Operasi Mudah?

Adakah Strim Sentiasa Lebih Lambat Daripada Koleksi Tradisional untuk Operasi Mudah?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-03 17:46:02895semak imbas

Are Streams Always Slower Than Traditional Collections for Simple Operations?

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:

  • Menggunakan LinkedList: LinkedList bukanlah pilihan yang optimum untuk senarai hasil kerana ia tidak mempunyai akses rawak yang cekap. Pertimbangkan untuk menggunakan ArrayList sebaliknya.
  • Metodologi Penanda Aras: Penanda aras manual boleh terdedah kepada ketidaktepatan. Gunakan rangka kerja penandaarasan seperti JMH (Java Microbenchmarking Harness) untuk memberikan ukuran yang lebih tepat dan boleh dipercayai.

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:

  • Strim sememangnya tidak lebih perlahan daripada koleksi. Walau bagaimanapun, overhed mereka boleh mengatasi faedah dalam kes penggunaan tertentu, seperti operasi penapisan dan pemetaan mudah.
  • Strim menawarkan kelebihan ketara dari segi kesederhanaan dan kebolehselenggaraan kod. Mereka memudahkan saluran paip pemprosesan data dan mengurangkan kod boilerplate.
  • Untuk laluan kod kritikal prestasi, sentiasa dinasihatkan untuk menjalankan penanda aras yang menyeluruh dan mempertimbangkan keperluan khusus aplikasi anda.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn