ฉันกำลังทำงานกับปัญหาด้านประสิทธิภาพของ JavaScript ดังนั้นฉันอยากถามว่า: วิธีที่เร็วที่สุดในการตรวจสอบว่าสตริงมีซับสตริงอื่น (ฉันต้องการค่าบูลีน) หรือไม่ คุณช่วยแนะนำความคิดและตัวอย่างโค้ดตัวอย่างได้ไหม
ฉันกำลังทำงานกับปัญหาด้านประสิทธิภาพของ JavaScript ดังนั้นฉันอยากถามว่า: วิธีที่เร็วที่สุดในการตรวจสอบว่าสตริงมีซับสตริงอื่น (ฉันต้องการค่าบูลีน) หรือไม่ คุณช่วยแนะนำความคิดและตัวอย่างโค้ดตัวอย่างได้ไหม
คำตอบ:
คุณมีสองคนที่เป็นไปได้:
(new RegExp('word')).test(str)
// or
/word/.test(str)
str.indexOf('word') !== -1
ดูเหมือนว่าการแสดงออกปกติจะเร็วขึ้น (อย่างน้อยใน Chrome 10)
การทดสอบประสิทธิภาพ - หญ้าทะเลสั้น
การทดสอบประสิทธิภาพ - หญ้าทะเลยาว
ไม่สามารถพูดด้วยความมั่นใจว่าวิธีใดเร็วกว่า ความแตกต่างระหว่างเบราว์เซอร์นั้นมหาศาล ในขณะที่ Chrome 10 indexOf
ดูเหมือนว่าจะเร็วกว่าใน Safari 5 indexOf
นั้นช้ากว่าวิธีอื่น ๆ อย่างเห็นได้ชัด
คุณต้องดูและลองด้วยตัวเอง ขึ้นอยู่กับความต้องการของคุณ ตัวอย่างเช่นการค้นหาแบบคำนึงถึงขนาดตัวพิมพ์เป็นวิธีที่รวดเร็วขึ้นด้วยนิพจน์ทั่วไป
อัปเดต 2018:
เพียงเพื่อช่วยชีวิตผู้คนไม่ให้ทำการทดสอบตัวเองนี่คือผลลัพธ์ปัจจุบันสำหรับเบราว์เซอร์ทั่วไปส่วนใหญ่เปอร์เซ็นต์บ่งบอกถึงประสิทธิภาพที่เพิ่มขึ้นจากผลลัพธ์ที่เร็วที่สุดถัดไป (ซึ่งแตกต่างกันระหว่างเบราว์เซอร์):
Chrome: indexOf (~ 98% เร็วกว่า) <-- wow
Firefox:แคช RegExp (เร็วขึ้น ~ 18%)
IE11:แคช RegExp (เร็วขึ้น 10%)
ขอบ:ดัชนีเร็วขึ้น (~ 18%)
Safari:แคช RegExp (~ 0.4% เร็วขึ้น)
โปรดทราบว่าRegExp ที่แคชคือ: var r = new RegExp('simple'); var c = r.test(str);
เมื่อเทียบกับ:/simple/.test(str)
indexOf
ไม่ได้ผล ฉันไม่แน่ใจว่าทำไม ใช้ Regex แม้ว่า นี่คือกรณีขอบ แต่คนอื่น ๆ อาจพบปัญหาเดียวกัน
มันใช้งานได้สำหรับคุณหรือไม่
string1.indexOf(string2) >= 0
แก้ไข: สิ่งนี้อาจไม่เร็วกว่า RegExp หาก string2 มีรูปแบบที่ซ้ำกัน ในบางเบราว์เซอร์ indexOf อาจช้ากว่า RegExp มาก ดูความคิดเห็น
แก้ไข 2: RegExp อาจเร็วกว่า indexOf เมื่อสตริงยาวมากและ / หรือมีรูปแบบซ้ำ ๆ ดูความคิดเห็นและคำตอบของ @ Felix
test
แน่นอน
indexOf
มีขนาดช้ากว่าวิธีอื่นใด ดังนั้นจึงไม่สามารถบอกได้ว่าวิธีใดเร็วกว่า มันแตกต่างจากเบราว์เซอร์เบราว์เซอร์
ที่เร็วที่สุด
var string = "hello" substring = "lo"; string.includes (substring);
var string = "hello" substring = "lo"; string.indexOf (สตริงย่อย)! == -1;
ใน ES6 includes()
วิธีการจะใช้ในการกำหนดว่าอาจพบสตริงหนึ่งภายในสตริงอื่นกลับtrue
หรือfalse
ตามความเหมาะสม
var str = 'To be, or not to be, that is the question.';
console.log(str.includes('To be')); // true
console.log(str.includes('question')); // true
console.log(str.includes('nonexistent')); // false
นี่คือjsperfระหว่าง
var ret = str.includes('one');
และ
var ret = (str.indexOf('one') !== -1);
ตามผลลัพธ์ที่แสดงใน jsperf ดูเหมือนว่าทั้งคู่จะทำงานได้ดี
str.includes("x|y")
; ค้นหาตัวอักษร "x" หรือ "y" ในการโทรเดียวกัน
regex
ดังกล่าวได้ หนึ่งในการทำงานรอบสำหรับคำถามของคุณstr.includes("x") || str.includes('y')
indexOf
เร็วกว่าincludes
(สูงกว่า 1600% เร็วกว่า) ยังไม่ชัดเจนว่าความแตกต่างของการวนซ้ำ 44 ล้านครั้ง / วินาทีและ777+ ล้านตัวต่อวินาทีนั้นส่งผลกระทบต่อประสิทธิภาพการทำงานจริงอย่างไรมือถือน่าจะได้รับประโยชน์มากพอที่indexOf
ควรจะเป็นตัวเลือกในอุดมคติ
ฉันได้พบว่าการใช้ง่ายสำหรับวงวนมากกว่าองค์ประกอบทั้งหมดในสตริงและเปรียบเทียบโดยใช้charAt
ดำเนินการได้เร็วกว่าหรือindexOf
Regex
รหัสและหลักฐานที่มีอยู่ในJSPerf
ETA: indexOf
และcharAt
ทั้งคู่ทำงานได้แย่มากใน Chrome Mobile ตามข้อมูลขอบเขตของเบราว์เซอร์ที่อยู่ใน jsperf.com
สำหรับการค้นหาสตริงอย่างง่าย ๆ การใช้วิธี indexOf () และการใช้ regex นั้นค่อนข้างเหมือนกัน: http://jsperf.com/substring - ดังนั้นเลือกอันไหนที่เขียนง่ายกว่า
ฉันสร้าง jsben.ch ให้คุณhttp://jsben.ch/#/aWxtF ... ดูเหมือนว่า indexOf จะเร็วขึ้นเล็กน้อย
มันเป็นวิธีง่ายๆในการใช้.match()
วิธีการสตริง
var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));
ขอให้คุณเป็นวันที่ดีนะ!
match
เมื่อมีtest
วิธี ... ตรวจสอบคำตอบด้านบน
regex
แท็ก)