programing

JavaScript에서 문자열에 다른 하위 문자열이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까?

javaba 2022. 10. 26. 21:17
반응형

JavaScript에서 문자열에 다른 하위 문자열이 포함되어 있는지 확인하는 가장 빠른 방법은 무엇입니까?

JavaScript에서 성능 문제를 처리하고 있습니다.문자열에 다른 서브스트링이 포함되어 있는지 여부를 확인하는 가장 빠른 방법은 무엇입니까(부울 값만 있으면 됩니다).아이디어와 샘플 코드 스니펫을 제안해 주시겠습니까?

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

  1. 정규 표현:

     (new RegExp('word')).test(str)
     // or
     /word/.test(str)
    
  2. 다음과 같습니다indexOf.

     str.indexOf('word') !== -1
    
  3. 다음과 같습니다includes.

     str.includes('word')
    

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

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


**Update 2011:**

어떤 방법이 더 빠르다고 확실하게 말할 수는 없다.브라우저 간의 차이는 엄청나다. 10 Chrome 10 중indexOf5, Safari 더 것 .indexOf을 사용하다 른 른 른 른 른 어 어 느 느 다 다 다 다 다 다 다 다다

스스로 보고 노력해야 합니다.니즈에 따라 다르죠.예를 들어 대소문자를 구분하지 않는 검색은 정규식을 사용하는 것이 훨씬 빠릅니다.


업데이트 2018:

사용자가 직접 테스트를 실행하지 않도록 하기 위해 대부분의 일반적인 브라우저에 대한 현재 결과를 보여 줍니다. 이 비율은 다음으로 빠른 결과(브라우저에 따라 다름)에 대한 성능 향상을 나타냅니다.

Chrome: 인덱스 Of (98% 이상 고속)<-- wow
파이어폭스: 캐시된 RegExp (최대 18% 고속)
IE11: 캐시된 RegExp (최대 10 % 고속)
에지: 인덱스 Of(최대 18% 고속)
Safari: 캐시된 RegExp (최대 0.4% 고속)

캐시된 RegExp는 다음과 같습니다.var r = new RegExp('simple'); var c = r.test(str); as as를를이::::::::/simple/.test(str)

가장 빠른 속도

  1. (ES6)에는 다음이 포함됩니다.
var string = "hello",서브스트링 = "lo";string.discling(호출링);
  1. ES5 이전 인덱스 Of
var string = "hello",서브스트링 = "lo";string.indexOf(서브스트링) !== -1;

http://jsben.ch/9cwLJ

enter image description here

이거 괜찮으세요?

string1.indexOf(string2) >= 0

편집: string2에 반복 패턴이 포함되어 있는 경우 RegExp보다 빠르지 않을 수 있습니다.일부 브라우저에서는 indexOf가 RegExp보다 훨씬 느릴 수 있습니다.댓글을 참조해 주세요.

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

ES6에서는 이 메서드를 사용하여 어떤 문자열이 다른 문자열 내에서 검출될 수 있는지 여부를 판단하고 반환한다.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에 나타난 결과 둘 다 성능이 좋은 것 같습니다.

간단한 for 루프를 사용하여 문자열의 모든 요소를 반복하고 비교합니다.charAt보다 고속으로 동작합니다.indexOf또는Regex코드와 증명은 JSPerf에서 구할 수 있습니다.

도착 예정일:indexOf그리고.charAtjsperf.com에 나와 있는 브라우저 스코프 데이터에 따르면 둘 다 Chrome Mobile에서 마찬가지로 나쁜 성능을 발휘합니다.

사용하기 쉬운 방법.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)));

좋은 하루 되세요, 선생님!

jsben.ch#/aWxtF...를 만들어 indexOf가 조금 더 빠르다고 알려드렸습니다.

간단한 문자열을 찾는 경우 indexOf() 메서드와 regex 메서드는 http://jsperf.com/substring과 거의 동일합니다.따라서 쓰기 쉬운 것을 선택합니다.

2022년 스트링 리서치

Felix Kling의 답변과 주어진 링크에 대한 테스트를 통해 확인했습니다.

가장 많이 사용되는 브라우저:

  1. 크롬(64%)
  2. Safari(19%)
  3. 새로운 엣지 (4%)
  4. 파이어폭스(3.26%)
  5. 삼성(2.86%)
  6. 오페라 (2.12%)

Chrome과 NE는 모두 Chromium =>의 성능을 기반으로 합니다.

ci = 대소문자를 구분하지 않음
/ = 왼쪽과 동일

테스트 결과

문자열 길이 파이어폭스 사파리 크롬
짧다 캐시된 RegExp CI 캐시된 RegExp CI 인덱스 Of 및/ci 가치가 있는
RegExp &/ci RegExp ci RegExp &/ci 더 나쁜
캐시된 RegExp 캐시된 RE & / ci & reg ci 색인 가치가 있는
인덱스 Of CI 인덱스 Of CI RegExp 더 나쁜

연산/초 비교

브라우저 파이어폭스 사파리 크롬
캐시된 RegExp 1.3M 425k 1.2M
다르다 1.08x >
캐시된 RegExp 대소문자를 구분합니다. 2800만 31M 4200만
다르다 1.44/1.35x >
색인 2700만 25M 1.9억
다르다 70/76x >
index Of 대소문자를 구분합니다. 1,380만 1,850만 1.9억
다르다 137/170x >

Firefox best 메서드: 캐시된 regexp 대소문자를 구분하지 않음
Chrome best 메서드: indexOf / indexOf case 구분 없음
Safari best 메서드: 캐시된 RegExp 대소문자를 구분하지 않음

크롬은 다른 두 제품보다 훨씬 뛰어난 성능을 가지고 있다.

최적의 타협: index Of:String.indexOf(substring) > -1.

주의: 를 사용하는 경우는,indexOf case sensitiveway, 를 조작하는 경우String.toLowerCase()조작이 몇 가지 추가되기 때문에 무감각한 방법과 거의 비슷합니다.이 경우 하위 문자열은 검색 프로세스가 아닌 검색 프로세스 전에 내려야 합니다.

정규식은 복잡하거나 패턴 연구/치환에 매우 적합합니다.그러나 글로벌 연구에는 적합하지 않습니다.모든 언어에서 정규식은 어떤 것이든 마찬가지입니다.

언급URL : https://stackoverflow.com/questions/5296268/fastest-way-to-check-a-string-contain-another-substring-in-javascript

반응형