[Javascript] 왜 문자열 연결은 배열 결합보다 빠릅니까?


Answers

Firefox는 Ropes ( Ropes : Strings에 대한 대안) 라는 이름을 사용하기 때문에 빠릅니다. 로프는 기본적으로 모든 노드가 문자열 인 DAG입니다.

예를 들어 a = 'abc'.concat('def') 를하면 새롭게 생성 된 객체는 다음과 같습니다. 물론 문자열 형식, 길이 및 기타에 대한 필드가 있어야하기 때문에 이것이 메모리에서 어떻게 보이는지 정확히 알 수 없습니다.

a = {
 nodeA: 'abc',
 nodeB: 'def'
}

그리고 b = a.concat('123')

b = {
  nodeA: a, /* {
             nodeA: 'abc',
             nodeB: 'def'
          } */
  nodeB: '123'
}           

따라서 가장 단순한 경우 VM은 거의 아무런 작업도 수행하지 않아야합니다. 유일한 문제는 결과 문자열에 대한 다른 연산 속도가 느려지는 것입니다. 또한 이것은 물론 메모리 오버 헤드를 줄입니다.

반면에 ['abc', 'def'].join('') 은 보통 새로운 문자열을 메모리에 배치하기 위해 메모리를 할당합니다. (어쩌면이 최적화해야합니다)

Question

오늘, 나는 문자열 연결의 속도에 대해이 글을 읽었다.

놀랍게도 문자열 연결이 승자가되었습니다.

http://jsben.ch/#/OJ3vo

그 결과는 내가 생각했던 것과 반대였다. 게다가, 이와 반대로 설명하는 많은 기사가 있습니다.

브라우저가 최신 버전의 문자열 concat 에 최적화되어 있다고 추측 할 수 있지만 어떻게 처리합니까? 문자열을 연결할 때 + 를 사용하는 것이 더 낫다고 말할 수 있습니까?

최신 정보

따라서 최신 브라우저에서는 문자열 연결을 최적화하므로 문자열을 연결할 때 join 보다 + 부호를 사용하는 것이 빠릅니다.

그러나 @Arthur 는 분리 기호로 문자열을 실제로 결합 하려는 경우 join 이 더 빠르다고 지적했습니다 .




이것은 분명히 자바 스크립트 엔진 구현에 따라 다릅니다. 한 엔진의 다른 버전에 대해서조차도 다른 결과를 얻을 수 있습니다. 이를 확인하려면 자체 벤치 마크를 수행해야합니다.

나는 String.concat 이 V8의 최신 버전에서 더 나은 성능을 가지고 있다고 말할 것이다. 그러나 Firefox와 Opera의 경우 Array.join 이 승자입니다.




문자열을 사용하면 더 큰 버퍼를 미리 할당하는 것이 더 쉬워 진다고 말할 수 있습니다. 각 요소는 단 2 바이트 (유니 코드 인 경우)이므로 보수적 인 경우에도 문자열에 대해 꽤 큰 버퍼를 미리 할당 할 수 있습니다. arrays 사용하면 각 요소가 Object 이기 때문에 각 요소가 더 복잡합니다. 따라서 보수적 인 구현은 적은 요소에 대해 공간을 미리 할당합니다.

for 앞서 for(j=0;j<1000;j++) 를 추가하려고하면 (chrome에서) 속도의 차이가 더 작아지는 것을 볼 수 있습니다. 결국 그것은 문자열 연결에 대해서는 여전히 1.5x 였지만 전에 있었던 2.6보다 작았습니다.

요소를 복사해야하는 경우 유니 코드 문자는 JS 객체에 대한 참조보다 작을 수 있습니다.

JS 엔진의 많은 구현에는 싱글 타입 배열에 대한 최적화가있어 내가 쓸모 없게 만들 수있는 가능성이 있음을 알아 두십시오 :-)




내 생각 엔 모든 버전이 많은 연결 비용을 들이고 있지만 조인 버전은 그 외에도 배열을 만들고있다.