JavaScript를 확인하는 가장 빠른 방법은 JavaScript에 다른 하위 문자열이 포함되어 있습니까?


163

JavaScript에서 성능 문제를 해결하고 있습니다. 그래서 그냥 묻고 싶습니다 : 문자열에 다른 하위 문자열이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까 (부울 값이 필요합니다)? 아이디어와 샘플 스 니펫 코드를 제안 해 주시겠습니까?


고정 부분 문자열에 대해 묻고 있습니까, 아니면 정규 표현식이 필요합니까 ( regex태그를 사용하면 약간 혼란 스럽습니다 )?
— Tim Pietzcker

1
이 게시물이 도움이 될 것입니다 .. stackoverflow.com/questions/1789945/javascript-string-contains
— mtk

문자열을 공백 주위의 배열로 분할하고 배열 교차를 수행하는 것은 어떻습니까? stackoverflow.com/questions/1885557/…
— giorgio79

답변:


315

두 가지 가능성이 있습니다.

  1. 정규식 :

    (new RegExp('word')).test(str)
    // or
    /word/.test(str)
  2. indexOf:

    str.indexOf('word') !== -1

정규 표현식이 더 빠른 것 같습니다 (적어도 Chrome 10에서는).

성능 테스트-짧은 건초 더미
성능 테스트-긴 건초 더미


2011 년 업데이트 :

어떤 방법이 더 빠르다고 확신 할 수는 없습니다. 브라우저 간의 차이점은 엄청납니다. 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)


3
구문 분석 시간 동안 정규식이 JavaScript 엔진에 의해 작성되기 때문에 텍스트 검색 대상을 미리 알고있는 경우 (즉, 변수에 저장되지 않은 경우)에만 조금 더 빠를 수 있습니다. 다른 문자열 변수 내의 변수에 포함 된 문자열을 검색하려면 RegExp 객체를 만들고 특수 문자 등을 피하기 위해 문자열을 처리해야하기 때문에 indexOf가 가장 빠릅니다.
— Stephen Chung

경험상, 검색 대상에
— .toLowerCase

Microsoft의 Office Javascript API를 사용하여 Office 2013 앱을 작성하고 있는데 indexOf작동하지 않습니다. 왜 그런지 잘 모르겠습니다. 그래도 정규식을 사용합니다. 이것은 극단적 인 경우이지만 다른 사람들도 같은 문제가 발생할 수 있습니다.
— Andy Mercer

substr ()이 가능한 해결책 중 하나가 아닌 이유는 무엇입니까? 많은 상황에서 RegEx 솔루션보다 훨씬 빠릅니다. 나는 같이 IndexOf () 비교 방법을 알고하지 않습니다하지만 (항상의 벌금, 어쩌면 그 효과에 메모를 추가하는 것이 다음 같이 IndexOf ()보다 더 수행하기 때문에 당신은 그것을 왼쪽으로 그렇게합니다.) 편집 : 이 JSperf 링크 쇼를 몇 가지 흥미로운 결과. 짧은 버전 : indexOf ()는 모든 메소드 중에서 가장 빠르지 만 문자열 길이와 반복되는 패턴에 따라 달라질 수 있습니다.
— Byson

1
@ 들소 : 어디를 볼지 이미 알고 있다면 substr 만 사용할 수 있습니다. 나는 일반적인 솔루션에만 집중했습니다.
— Felix Kling

17

이것이 당신을 위해 작동합니까?

string1.indexOf(string2) >= 0

편집 : string2에 반복 패턴이 포함되어 있으면 RegExp보다 빠르지 않을 수 있습니다. 일부 브라우저에서는 indexOf가 RegExp보다 훨씬 느릴 수 있습니다. 의견을 참조하십시오.

편집 2 : 문자열이 매우 길거나 반복되는 패턴이 포함 된 경우 RegExp가 indexOf보다 빠를 수 있습니다. 의견과 @Felix의 답변을 참조하십시오.


그러나 이것은 다른 방법과 어떻게 비교됩니까? 이것이 가장 빠른가요, 아니면 그렇게하는 많은 방법 중 하나입니까?
— Chii

JavaScript 자체로 구현되므로 기본 코드를 실행하므로 빠르다. JavaScript 코드를 기반으로하는 다른 방법은 속도가 느려집니다. 정확한 문자열을 알고 있으면 정규식이 약간 빠를 수 있습니다 (JavaScript 엔진은 프로토 타입 체인을 따라 .indexOf를 찾을 필요가 없으므로).
— Stephen Chung

대소 문자를 구분하지 않는 검색이 필요한 경우 RegExp 객체를 빌드하고을 호출해야 test합니다.
— Stephen Chung

3
Safari에서 테스트를 실행했습니다. indexOf다른 방법보다 속도가 느립니다. 따라서 실제로 어떤 방법이 더 빠르다고 말할 수는 없습니다. 브라우저마다 다릅니다.
— Felix Kling

@Felix, 그것은 좋은 관찰입니다 (실제로 직접 시도 할 때까지 아무것도 신뢰하지 마십시오)! 반복되는 패턴이 많은 문자열에서 말하는 것을 기억하는 것이 좋습니다. 정규식은 상태 머신으로 컴파일되고 단순 루프보다 훨씬 빨리 역 추적 할 수 있기 때문에 정규 루프는 단순한 루프 비교 구현보다 빠르게 수행해야합니다. 다음 문자로 추적하십시오. 실험을하고 이것을 꺼내면 +1!
— Stephen Chung

17

가장 빠른

  1. (ES6) 포함
    var string = "hello",
    부분 문자열 = "lo";
    string.includes (하위 문자열);
  1. ES5 및 이전 indexOf
    var string = "hello",
    부분 문자열 = "lo";
    string.indexOf (하위 문자열)! == -1;

http://jsben.ch/9cwLJ

여기에 이미지 설명을 입력하십시오


8

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에 표시된 결과는 둘 다 잘 수행되는 것 같습니다.


include '인수로 "regex"를 사용할 수 있습니까? 처럼 : str.includes("x|y"); 동일한 호출에서 리터럴 "x"또는 "y"를 검색하십시오.
— ptkato

@Patrick, 포함 문서에 따라 사용할 수 없습니다 regex. 귀하의 질문에 대한 주위에 한 작품str.includes("x") || str.includes('y')
— zangw

크롬 자바 스크립트 (59)의 개선의 결과로서, indexOf매우 빠르고보다 includes(위쪽 1,600% 속도의). 초당 4,400 만 반복과 777+ 백만 i / sec 의 차이가 실제 성능에 어떤 영향을 미치는지 확실하지 않지만 모바일이 indexOf이상적인 선택이 될 만큼 충분한 이점을 제공 할 수 있습니다.
— 채드 레비

7

간단한 for 루프를 사용하여 문자열의 모든 요소를 ​​반복하고 using을 사용하여 비교하는 charAt것이 indexOf또는 보다 빠릅니다 Regex. 코드와 증명은 JSPerf 에서 구할 수 있습니다 .

ETA : indexOf그리고 charAt모두 jsperf.com에 나와있는 브라우저 범위의 데이터에 따라 크롬 모바일에 유사 끔찍한 수행


손으로 만든 기능이 내장 기능보다 낫다는 것이 이상하지만 바늘이 하나의 문자이기 때문입니다. 아직도 ...
— Moss

Apple iPad (iOS 7.1.1)의 Chrome Mobile 36.0.1985.57에서 테스트되었습니다. IndexOf가 더 빠릅니다. 미안
— rpax

@rpax CharAt은 IndexOf와 CharAt가 데스크톱에 비해 똑같이 성능이 떨어지는 Chrome Mobile을 제외하고 모든 플랫폼 (jsperf의 기록을 기반으로)에서 여전히 훨씬 빠릅니다 .
— wpg4665

1
NodeJS에서 이것이 어떻게 수행되는지보고 싶습니다. 또한 하나의 문자 대 하위 문자열 만 찾고 있기 때문에 이것은 실제로 좋은 예가 아닙니다.
— qodeninja

이것은 전혀 올바른 대답이 아닙니다. 하위 문자열을 검색하지 않고 하나의 단일 문자 만 발생합니다
— Henrik Myntti

3

: 간단한 문자열을 찾는 같이 IndexOf () 메소드를 사용하여 정규 표현식을 사용하기 위해 거의 동일 http://jsperf.com/substring - 그래서 어느 하나 쓰기보다 쉽게 보인다 선택할.



1

.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)));

좋은 하루 되시길 바랍니다.


4
방법 match이있을 이유가 없습니다 test... 최고의 답변을 확인하십시오.
— Bergi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.