Saya bekerja dengan masalah kinerja pada JavaScript. Jadi saya hanya ingin bertanya: apa cara tercepat untuk memeriksa apakah sebuah string berisi substring lain (saya hanya perlu nilai boolean)? Bisakah Anda menyarankan ide dan contoh kode snippet Anda?
javascript
regex
substring
Đinh Hồng Châu
sumber
sumber
regex
tag)?Jawaban:
Anda memiliki dua kemungkinan:
Ekspresi reguler :
indexOf
:Ekspresi reguler tampaknya lebih cepat (setidaknya di Chrome 10).Uji kinerja - tumpukan jerami pendek
Uji kinerja - tumpukan jerami panjang
Pembaruan 2011:
Tidak bisa dikatakan dengan pasti metode mana yang lebih cepat. Perbedaan antara browser sangat besar. Sementara di Chrome 10
indexOf
tampaknya lebih cepat, di Safari 5,indexOf
jelas lebih lambat daripada metode lainnya.Anda harus melihat dan mencoba sendiri. Semua tergantung dari kebutuhan Anda. Misalnya pencarian case-insensitive jauh lebih cepat dengan ekspresi reguler.
Pembaruan 2018:
Hanya untuk menyelamatkan orang dari menjalankan tes itu sendiri, berikut adalah hasil saat ini untuk browser yang paling umum, persentase menunjukkan peningkatan kinerja dibandingkan hasil tercepat berikutnya (yang bervariasi antara browser):
Chrome: indexOf (~ 98% lebih cepat)
<-- wow
Firefox: cached RegExp (~ 18% lebih cepat)
IE11: cached RegExp (~ 10% lebih cepat)
Edge: indexOf (~ 18% lebih cepat)
Safari: cached RegExp (~ 0,4% lebih cepat)
Perhatikan bahwa RegExp yang di- cache adalah:
var r = new RegExp('simple'); var c = r.test(str);
sebagai lawan dari:/simple/.test(str)
sumber
indexOf
tidak berfungsi. Saya tidak yakin mengapa. Menggunakan Regex tidak. Ini adalah kasus tepi, tetapi orang lain mungkin mengalami masalah yang sama.Apakah ini Bekerja untukmu?
Sunting: Ini mungkin tidak lebih cepat dari RegExp jika string2 berisi pola berulang. Pada beberapa browser, indexOf mungkin jauh lebih lambat daripada RegExp. Lihat komentar.
Sunting 2: RegExp mungkin lebih cepat daripada indexOf ketika string sangat panjang dan / atau berisi pola berulang. Lihat komentar dan jawaban @ Felix.
sumber
test
.indexOf
adalah besarnya lebih lambat dari metode lainnya. Jadi sebenarnya tidak bisa dikatakan metode mana yang lebih cepat. Ini bervariasi dari browser ke browser.Tercepat
http://jsben.ch/9cwLJ
sumber
Dalam ES6,
includes()
metode ini digunakan untuk menentukan apakah satu string dapat ditemukan dalam string lain, kembalitrue
ataufalse
sesuai.Inilah jsperf di antaranya
Dan
Seperti yang ditunjukkan pada jsperf, sepertinya keduanya berkinerja baik.
sumber
str.includes("x|y")
:; cari literal "x" atau "y" dalam panggilan yang sama.regex
di dalamnya. Satu jawaban untuk pertanyaan Anda,str.includes("x") || str.includes('y')
indexOf
secara signifikan lebih cepat daripadaincludes
(lebih dari 1600% lebih cepat). Tidak jelas bagaimana perbedaan 44 juta iterasi / detik dan 777+ juta i / detik memengaruhi kinerja dunia nyata, namun ponsel sepertinya cukup memberi manfaat yangindexOf
seharusnya menjadi pilihan ideal.Saya telah menemukan bahwa menggunakan loop sederhana untuk, iterasi semua elemen dalam string dan membandingkan menggunakan
charAt
melakukan lebih cepat daripadaindexOf
atauRegex
. Kode dan bukti tersedia di JSPerf .ETA:
indexOf
dancharAt
keduanya melakukan hal yang sama mengerikannya di Chrome Mobile menurut data Cakupan Browser yang terdaftar di jsperf.comsumber
Untuk menemukan string sederhana, menggunakan metode indexOf () dan menggunakan regex hampir sama: http://jsperf.com/substring - jadi pilih yang mana yang lebih mudah untuk ditulis.
sumber
Saya membuat jsben.ch untuk Anda http://jsben.ch/#/aWxtF ... tampaknya indexOf sedikit lebih cepat.
sumber
Ini cara mudah untuk menggunakan
.match()
metode ke string.Semoga hari Anda menyenangkan, tuan!
sumber
match
kapan adatest
metode ... Periksa jawaban teratas.