Membandingkan Kecekapan untuk-setiap Gelung dan Lelaran
Soalan:
Apabila ia datang kepada lelaran melalui koleksi, pendekatan manakah yang lebih cekap: untuk setiap gelung atau lelaran?
Perbincangan:
Kedua-dua untuk setiap gelung dan iterator berkhidmat tujuan yang sama: untuk melintasi koleksi. Walau bagaimanapun, terdapat perbezaan yang ketara antara kedua-duanya yang boleh menjejaskan kecekapan dalam kes tertentu.
Dipertingkatkan untuk setiap Gelung (untuk setiap gelung):
Dipertingkatkan untuk -setiap gelung, juga dikenali sebagai untuk setiap gelung, menyediakan sintaks ringkas untuk lelaran melalui koleksi. Ia melelang secara automatik ke atas elemen koleksi, memperuntukkan setiap elemen kepada pembolehubah yang ditentukan dalam gelung.
Pelajar:
Pelajar ialah objek yang mewakili keadaan perjalanan melalui koleksi. Ia menyediakan kaedah untuk menyemak sama ada terdapat lebih banyak elemen (hasNext) dan untuk mendapatkan semula elemen seterusnya (seterusnya).
Pertimbangan Kecekapan:
Untuk Struktur Data dengan O(1) get(i) Operasi:
Jika struktur data asas menyokong O(1) mendapatkan semula elemen menggunakan kaedah get(i) (cth., tatasusunan, ArrayList), maka ada tiada perbezaan ketara dalam kecekapan antara menggunakan untuk setiap gelung atau lelaran.
Untuk Struktur Data dengan O(n) get(i) Operasi:
Walau bagaimanapun , untuk struktur data yang get(i) mempunyai kerumitan O(n) (cth., senarai terpaut), menggunakan iterator menjadi lebih cekap. Iterator sememangnya memerlukan operasi seterusnya ialah O(1), yang menghasilkan kerumitan masa gelung keseluruhan O(n). Sebaliknya, bagi setiap gelung yang bergantung pada get(i) akan mempunyai kerumitan masa O(n^2), menjadikannya kurang cekap dengan ketara.
Perbandingan Bytecode:
Untuk menunjukkan kesetaraan bagi setiap gelung dan iterator, kita boleh memeriksa kod bait yang dijananya. Membandingkan kod bait untuk kedua-dua senario mendedahkan operasi yang sama, menunjukkan bahawa tiada penalti prestasi dalam memilih salah satu bentuk.
Kesimpulan:
Untuk koleksi yang get(i) mempunyai O(1) kerumitan, kedua-dua untuk setiap gelung dan lelaran adalah sama cekap. Walau bagaimanapun, untuk koleksi dengan kerumitan O(n) get(i), iterator ialah pilihan yang disyorkan atas sebab kecekapan. Akhirnya, pendekatan terbaik bergantung pada struktur data khusus dan gelagat lelaran yang diingini.
Atas ialah kandungan terperinci Untuk-Setiap Gelung lwn. Iterator: Manakah yang Lebih Cekap untuk Lelaran Koleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!