사용자 삽입 이미지
Tom Trenka씨가 여러 브라우저에 걸쳐 JavaScript 성능 분석을 상세히 설명했습니다. 이는 매우 중요한 작업이며, 저에게는 사람들이 pool을 사용하려하고 새로운 VM 기술이 나타나면 어떤 것이 성능에 나쁜지 찾으려하던 JVM 시절을 떠올리게 합니다. 꼼수를 너무 많이 사용하면 새 버전이 꼼수가 아닌 일반적인 작업을 최적화함에 따라 결국엔 좋지않은 상태가 될 수도 있습니다.

Eugene Lazutkin씨가 언어의 문자열에 대해 아주 잘 설명해주셨습니다:

많은 현대 언어들(특히 함수형 언어들)은 메모리 보존memory conservation, 캐시 지역화cache localization 등의 많은 문제를 해결하는 "불변 객체immutable object" 패러다임을 도입했습니다. 아이디어는 간단합니다: 객체가 불변이라면, 그것은 레퍼런스(포인터나 핸들)에 의해 나타내지고, 레퍼런스를 전달하는 것은 객체를 값으로 전달하는 것과 동일합니다 — 객체가 불변이라면, 값은 변하지 않습니다 => 이 객체를 가리키는 포인터는 원래와 같은 값을 만들면서 레퍼런스를 해제합니다. 이것은 객체를 복제하지 않고 레퍼런스만 복제할 수 있다는 의미입니다. 그리고 그들 모두는 같은 객체를 가리킬 것입니다. 객체를 바꾸려면 뭘 해야할까요? 가장 유명한 해결책은 기록시 복사(Copy-on-write, 이하 COW)하는 것입니다. COW 원칙하에서, 우리는 객체에 대한 포인터(레퍼런스, 핸들)를 가지고, 그것이 가리키는 객체를 복사하고, 포인터의 값을 변경해 이제 포인터는 복사된 객체를 가리키게 되었습니다. 그리고, 우리의 변형 알고리듬을 진행했습니다. 여전히 다른 모든 레퍼런스는 동일합니다.

JavaScript는 문자열을 위한 모든 "불변 객체"를 수행하지만, 간단한 트릭을 사용하고 있어서 문자열의 COW는 수행하지 않습니다. 문자열을 수정할 방법은 없습니다. 모든 문자열은 언어 명세와 함께 나온 표준 라이브러리의 힘으로 불변성을 가지고 있습니다. 예를 들어, str.replace("a","b") 는 str 을 전혀 수정하지 않고, 치환되거나 그렇지 않은 다른 문자열을 반환합니다. 제가 추측한 패턴을 찾을 수 없다면 원래 문자열의 포인터를 반환합니다. 문자열의 모든 “변형“ 연산은 실제로는 원래의 문자열은 변경되지 않도록 남겨둔 채 새 객체를 반환합니다: replace, concat, slice, substr, split 그리고 조금 성격이 다른 anchor, big, bold 등등조차 그렇습니다.

Tom씨가 그가 진행한 부분에 대해 상세히 설명해주셨습니다:

  • Round 1: 네이티브 연산 측정.
  • Round 2: 버퍼링 기술의 유형 비교.
  • Round 3: dodox.string.Builder에 결과 적용.

몇가지 놀랄만한 것이 있는데, Tom씨가 정리했습니다:

  • 모든 브라우저의 네이티브 문자열 연산은 다른 언어로부터 차용한 기술들이 거의 필요없는 수준까지 최적화되었습니다.
  • Array.join 이 여전히 Internet Explorer에서는 가장 빠른 방법인 것 같습니다; += 이나 String.prototype.concat.apply(””, arguments) 는 다른 모든 브라우저에서는 가장 좋은 방법입니다.
  • Firefox는 dynamic/변수를 통해 인자의 멤버에 접근하는데 분명히 이슈가 있었습니다.

Erik Arvidsson씨가 push()를 사용하는 이유를 알려주셨습니다: IE6 and it’s really bad GC.

IE 8 / FF 3 에서의 결과도 기대하겠습니다.

from Everything you wanted to know about String performance on Ajaxian
Posted by 행복한고니 트랙백 0 : 댓글 0