Efisiensi JavaScript dalam perulangan array berkapasitas besar tidak memuaskan. Saya pernah membuat perbandingan. Dibandingkan dengan array VBS, kecepatan loop array VBS kira-kira satu urutan besarnya lebih cepat daripada JS ( http://community.csdn.net /Expert/TopicView. asp?id=4313487 ). Kami tidak terlalu memperhatikan efisiensi array JS dalam pemrograman umum: Anda bahkan tidak dapat mengetahui efisiensi array dengan hanya beberapa lusin elemen, tetapi jumlah nodenya besar, seperti ribuan atau puluhan ribu Jika sejumlah besar loop array digunakan, masalah efisiensi menjadi masalah utama yang harus dipertimbangkan. Pengambilan array berkapasitas besar umumnya memiliki aplikasi berikut: pencocokan cepat saat memilih kotak kombo, kueri pohon, pengurutan atau pengambilan tabel, dll.
Biarkan saya melakukan tes. Pertama, saya membuat array berkapasitas besar:
<SCRIPT LANGUAGE="JavaScript">
var n = 100000; //Kapasitas maksimum array
var a = Array baru();
untuk(var i=0; saya<n; i++)
{
a[i] = Matematika.acak() +"";
}
</SCRIPT>
Dengan cara ini, saya membuat array karakter dengan panjang 100000, lalu saya mengambil string yang dimulai dengan 0,9999 dan menyimpannya di array lain.
<BAHASA SKRIP="JavaScript">
var n = 100000; //Kapasitas maksimum array
var a = Array baru();
untuk(var i=0; saya<n; i++)
{
a[i] = Matematika.acak() +"";
}
var mulai = Tanggal baru().getTime();
var b = Array baru();
untuk(var i=0; saya<n; i++)
{
jika(a[i].indexOf("0,9999")==0)
{
b[b.panjang] = a[i];
}
}
document.write("Panjang array: "+ n);
document.write("<br>Metode perulangan tradisional membutuhkan waktu" + (Tanggal baru().getTime() - mulai)
+" milidetik! Hasil pengambilan: <strong title='"+ b.join(" ")
+"'>Catatan "+ b.length +" diambil!</strong>");
</SCRIPT>
Langkah operasi ini memakan waktu sekitar 2800 milidetik. Untuk menjelaskannya, loop di sini sangat sederhana. Hanya ada penilaian if dan operasi penugasan. itu akan memakan waktu lebih lama. Jadi apakah ada solusi optimasi yang baik untuk masalah ini? Jawabannya tentu saja iya, kalau tidak semua yang saya sampaikan di postingan ini hanya akan membuang-buang kata saja. Namun kita tidak bisa lagi menggunakan pemikiran tradisional kita untuk mengoptimalkan masalah ini, karena tidak ada cara penulisan yang lebih baik yang dapat ditemukan dalam pemikiran tradisional.
Solusinya adalah: pertama gabung() array menjadi string besar, lalu gunakan ekspresi reguler untuk mencocokkan dan mengambil string besar. Cara ini bisa dikatakan sebagai orisinalitas pribadi saya. Saya menemukan trik yang tidak benar selama proses menulis pohon, tetapi efisiensinya lumayan. Saya telah membahas efisiensi join() ( http://blog.csdn.net/meizz/archive/2005/12/14/552260.aspx Kecepatan JavaScript: Efisiensi Menggabungkan dan Menyambungkan String). Rencana pengoptimalan ini memerlukan tingkat keterampilan ekspresi reguler tertentu.
<masukan id="hitungan" nilai="50000" size="7" maxlength="6">
<input type="button" value="Array Inisial Hua" onclick="txt.innerHTML = array_init()"><br>
<input type="button" value="Perulangan tradisional" onclick="txt.innerHTML += method_for()">
<input type="button" value="Pencocokan reguler" onclick="txt.innerHTML += method_regexp()">
<div id="txt"></div>
<BAHASA SKRIP="JavaScript">
var txt = dokumen.getElementById("txt");
var a = Array baru();
fungsi array_init()
{
var n = parseInt(document.getElementById("count").value);
a.panjang = 0;
untuk(var i=0; saya<n; i++)
{
a[i] = Matematika.acak() +"";
}
kembalikan "panjang array: "+ n;
}
fungsi metode_untuk()
{
var n = a.panjang;
var mulai = Tanggal baru().getTime();
var b = Array baru();
untuk(var i=0; saya<n; i++)
{
jika(a[i].indexOf("0,9999")==0)
{
b[b.panjang] = a[i];
}
}
return ("<br>Metode loop tradisional membutuhkan waktu" + (Tanggal baru().getTime() - mulai)
+" milidetik! Hasil pengambilan: <strong title='"+ b.join(" ")
+"'>Catatan "+ b.length +" diambil!</strong>");
}
fungsi metode_regexp()
{
var mulai = Tanggal baru().getTime();
var b = Array baru();
var s = a.join("x0f");
var r = RegExp baru().kompilasi("0\.9999\d+", "g");
b = s.pertandingan(r); s = "";
return ("<br>Metode pencocokan reguler membutuhkan waktu" + (Tanggal baru().getTime() - mulai)
+" milidetik! Hasil pengambilan: <strong title='"+ b.join(" ")
+"'>Catatan "+ b.length +" diambil!</strong>");
}
</SCRIPT>
Anda dapat mengujinya untuk melihat seberapa besar perbedaan efisiensi antara kedua metode di atas! Kode sudah mati, manusia masih hidup. Jika Anda mengubah pemikiran atau model Anda, efisiensinya akan sangat berbeda.
Saya membutuhkan banyak otak untuk menemukan trik ini, dan saya sangat enggan untuk membagikannya. Sekarang saya akan menggunakannya untuk mengucapkan selamat kepada semua orang di awal tahun baru 2006.