JavaScript에서 성능 문제를 해결하고 있습니다. 그래서 그냥 묻고 싶습니다 : 문자열에 다른 하위 문자열이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까 (부울 값이 필요합니다)? 아이디어와 샘플 스 니펫 코드를 제안 해 주시겠습니까?
JavaScript에서 성능 문제를 해결하고 있습니다. 그래서 그냥 묻고 싶습니다 : 문자열에 다른 하위 문자열이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까 (부울 값이 필요합니다)? 아이디어와 샘플 스 니펫 코드를 제안 해 주시겠습니까?
답변:
두 가지 가능성이 있습니다.
정규 표현식이 더 빠른 것 같습니다 (적어도 Chrome 10에서는).
성능 테스트-짧은 건초 더미
성능 테스트-긴 건초 더미
어떤 방법이 더 빠르다고 확신 할 수는 없습니다. 브라우저 간의 차이점은 엄청납니다. Chrome 10 indexOf
에서는 빠르지 만 Safari 5에서는 indexOf
다른 방법보다 속도가 느립니다.
당신은 자신을보고 시도해야합니다. 그것은 당신의 필요에 달려 있습니다. 예를 들어 대소 문자를 구분하지 않는 검색은 정규식을 사용하면 훨씬 빠릅니다.
2018 업데이트 :
사람들이 직접 테스트를 실행하지 못하도록하기 위해 가장 일반적인 브라우저의 현재 결과는 다음과 같습니다. 백분율은 다음으로 빠른 결과 (브라우저마다 다름)에 비해 성능이 향상되었음을 나타냅니다.
Chrome : indexOf (~ 98 % 빠름) <-- wow
Firefox : 캐시 된 RegExp (~ 18 % 빠름)
IE11 : 캐시 된 RegExp (~ 10 % 빠름)
Edge : indexOf (~ 18 % 빠름)
Safari : 캐시 된 RegExp (~ 0.4 % 빠름)
참고 정규식 캐시는 다음과 같습니다 var r = new RegExp('simple'); var c = r.test(str);
반대로 :/simple/.test(str)
indexOf
작동하지 않습니다. 왜 그런지 잘 모르겠습니다. 그래도 정규식을 사용합니다. 이것은 극단적 인 경우이지만 다른 사람들도 같은 문제가 발생할 수 있습니다.
이것이 당신을 위해 작동합니까?
string1.indexOf(string2) >= 0
편집 : string2에 반복 패턴이 포함되어 있으면 RegExp보다 빠르지 않을 수 있습니다. 일부 브라우저에서는 indexOf가 RegExp보다 훨씬 느릴 수 있습니다. 의견을 참조하십시오.
편집 2 : 문자열이 매우 길거나 반복되는 패턴이 포함 된 경우 RegExp가 indexOf보다 빠를 수 있습니다. 의견과 @Felix의 답변을 참조하십시오.
test
합니다.
indexOf
다른 방법보다 속도가 느립니다. 따라서 실제로 어떤 방법이 더 빠르다고 말할 수는 없습니다. 브라우저마다 다릅니다.
가장 빠른
var string = "hello", 부분 문자열 = "lo"; string.includes (하위 문자열);
var string = "hello", 부분 문자열 = "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
(위쪽 1,600% 속도의). 초당 4,400 만 반복과 777+ 백만 i / sec 의 차이가 실제 성능에 어떤 영향을 미치는지 확실하지 않지만 모바일이 indexOf
이상적인 선택이 될 만큼 충분한 이점을 제공 할 수 있습니다.
간단한 for 루프를 사용하여 문자열의 모든 요소를 반복하고 using을 사용하여 비교하는 charAt
것이 indexOf
또는 보다 빠릅니다 Regex
. 코드와 증명은 JSPerf 에서 구할 수 있습니다 .
ETA : indexOf
그리고 charAt
모두 jsperf.com에 나와있는 브라우저 범위의 데이터에 따라 크롬 모바일에 유사 끔찍한 수행
: 간단한 문자열을 찾는 같이 IndexOf () 메소드를 사용하여 정규 표현식을 사용하기 위해 거의 동일 http://jsperf.com/substring - 그래서 어느 하나 쓰기보다 쉽게 보인다 선택할.
나는 당신을 위해 jsben.ch했다 http://jsben.ch/#/aWxtF ... 같이 IndexOf 조금 더 빠른 것 같다.
regex
태그를 사용하면 약간 혼란 스럽습니다 )?