Saya telah menemukan anotasi loop berikut dalam proyek besar yang sedang saya kerjakan (pseudocode):
var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Yang menarik perhatian saya adalah variabel "n" ekstra ini. Saya belum pernah melihat for a lop ditulis dengan cara ini sebelumnya.
Jelas dalam skenario ini tidak ada alasan mengapa kode ini tidak dapat ditulis dengan cara berikut (yang saya sudah sangat terbiasa):
var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Tapi itu membuat saya berpikir.
Apakah ada skenario ketika menulis loop for seperti itu masuk akal? Ide terlintas dalam pikiran bahwa panjang "array" dapat berubah selama eksekusi loop, tetapi kami tidak ingin mengulang lebih jauh dari ukuran aslinya, tetapi saya tidak dapat membayangkan skenario seperti itu.
Mengecilkan array di dalam loop juga tidak masuk akal, karena kita cenderung mendapatkan OutOfBoundsException.
Apakah ada pola desain yang diketahui di mana anotasi ini bermanfaat?
Sunting Seperti dicatat oleh @ Jerry101 alasannya adalah kinerja. Berikut ini tautan ke tes kinerja yang telah saya buat: http://jsperf.com/ninforloop . Menurut pendapat saya perbedaannya tidak cukup besar kecuali Anda iterasi meskipun array yang sangat besar. Kode yang saya salin dari hanya memiliki hingga 20 elemen, jadi saya pikir keterbacaan dalam kasus ini melebihi pertimbangan kinerja.
sumber
n
mungkin lebih lambat daripada menggunakan varianarray.Length
karena JITter mungkin tidak melihat bahwa itu bisa menghilangkan cek batas array.Jawaban:
Variabel
n
memastikan kode yang dihasilkan tidak mengambil panjang array untuk setiap iterasi.Ini merupakan pengoptimalan yang dapat membuat perbedaan dalam jangka waktu berjalan tergantung pada bahasa yang digunakan, apakah array tersebut sebenarnya adalah objek koleksi atau "array" JavaScript, dan detail pengoptimalan lainnya.
sumber
n
ke loop, yang biasanya merupakan hal yang baik. Saya akan mendefinisikannya sebelum loop hanya jika saya ingin menggunakannya lagi nanti.Pengambilan panjang array dapat dengan mudah menjadi "lebih mahal" daripada tindakan aktual yang Anda lakukan berulang kali.
Jadi jika set tidak berubah, hanya kueri panjangnya sekali.
Tidak dengan array, tetapi dengan set-set rekaman yang berasal dari server sql saya telah melihat peningkatan dramatis dengan tidak menanyakan jumlah-catatan setiap iterasi. (tentu saja lakukan ini hanya jika Anda dapat menjamin Anda array atau set-record tidak berubah selama proses ini).
sumber
Orang-orang yang berbicara tentang kinerja mungkin benar bahwa inilah sebabnya mengapa ditulis demikian (orang yang menulisnya dengan cara itu mungkin tidak benar bahwa itu secara signifikan memengaruhi kinerja, tetapi itu masalah lain).
Namun, untuk menjawab bagian dari pertanyaan Anda ini, saya pikir itu paling mungkin terjadi ketika tujuan utama loop adalah untuk memodifikasi array yang berulang. Pertimbangkan sesuatu seperti ini, dalam pseudo-code:
Tentu saja ada cara lain untuk menulisnya. Dalam hal ini saya bisa mengecek untuk plus pada saat yang sama dengan memeriksa apakah penerima menerima undangan mereka, dan menghasilkan daftar tamu lengkap satu undangan pada suatu waktu. Saya tidak perlu ingin menggabungkan kedua operasi itu, tetapi saya tidak dapat segera memikirkan alasan mengapa itu pasti salah dan oleh karena itu desain ini diperlukan . Ini merupakan opsi untuk dipertimbangkan, sesekali.
Sebenarnya saya pikir hal yang paling salah dengan kode ini adalah keanggotaan
guests
array memiliki arti berbeda pada titik berbeda dalam kode. Karena itu saya tentu tidak akan menyebutnya "pola", tapi saya tidak tahu bahwa itu cukup cacat untuk mengesampingkan pernah melakukan hal semacam ini :-)sumber
Jika memungkinkan, Anda harus menggunakan iterator yang melintasi semua elemen array. Anda menggunakan array hanya sebagai urutan, bukan sebagai penyimpanan akses-acak, jadi akan jelas bahwa iterator yang hanya melakukan akses sekuensial akan lebih cepat. Bayangkan apa yang Anda pikir array sebenarnya adalah pohon biner, tetapi seseorang telah menulis kode yang menentukan "panjang" dengan menghitung elemen, dan kode yang mengakses elemen ke-i, juga dengan melintasi elemen, masing-masing dalam O (n ). Sebuah iterator bisa sangat cepat, loop Anda akan menjadi sloooooow.
sumber