2008-09-30 2 views
7

Javascript에서 여러 문자열을 연결해야하고 이렇게하는 가장 빠른 방법을 찾고 있습니다. Javascript가 자연스럽게 많은 작은 String으로 구성된 큰 XML "파일"을 만들어야한다고 가정 해 봅시다. 루프 또는 예를 구축 다른 "고급"코드에 어떤 관심을 지불하지 마십시오Javascript 문자열 연결이이 예제보다 빠릅니까?

var sbuffer = []; 
    for (var idx=0; idx<10000; idx=idx+1) { 
     sbuffer.push(‘<xmltag>Data comes here... bla... </xmltag>’); 
    } 
    // Now we "send" it to the browser... 
    alert(sbuffer.join(”)); 

: 그래서 함께했다.

내 질문은 : 알 수없는 문자열의 경우 많은 작은 문자열을 거대한 문자열로 연결하는 더 빠른 알고리즘/방법/아이디어가 있습니까?

답변

13

라인 변경 :

sbuffer[sbuffer.length] = ‘Data comes here... bla... ’;

sbuffer.push(‘Data comes here... bla... ’);

당신에게 5-50% 속도 이득을 줄 것이다 (IE에서, 브라우저에 따라 - 이득이 가장 높은 것)

감사합니다.

+1

통계 정보가 있습니까? 나는 모든 반복 (push 또는 array.length 중 하나)에서 길이 검사에 대한 패널티가 동일하게 작용할 것이라고 생각했을 것이다. IE의 문자열 연결 속도가 많이 필요하다는 사실을 알고 있습니다. – scunliffe

1

나는 당신이 최적에 아주 가깝다고 생각합니다. YMMV를 사용하면 호스트 프로세스 (예 : 브라우저)의 JavaScript 엔진에서 많은 속도가 발생하거나 손실됩니다.

+0

실제로 Javascript "성능"은 많은 클라이언트 컴퓨터에서 실행할 수있는 장점이 있습니다. 하나의 서버뿐만 아니라 et impere ;-)로 나눌 수 있습니다. 그러나 클라이언트 스크립팅이 점점 복잡 해짐에 따라 성능도 문제가됩니다. 질문 : YMMV는 무엇을 의미합니까? – Georgi

+0

귀하의 마일리지가 변경 될 수 있습니다. –

+0

@Georgi : 귀하의 마일리지가 변경 될 수 있습니다. –

15

질문 JavaScript string concatenationvery good comparison of JavaScript string concatenation performance에 연결된 대답을 가지고 있습니다.

편집 : 난 당신이 문서에서 알 수 있듯이 더프의 장치를 사용하여 조금 더 성능을 이크 수 있다고 생각했을 것이다 .

+0

Hello Sam, 나는 그 게시물을 보았다. 그러나 내 질문은 사람이 더 빠른 솔루션을 가지고 있고 결합 대 결합을 비교하려고 시도하지 않는다면 정말로 묻고있는 행동에서 약간 다르다. 누가 알아? 아마도 거대한 문자열에 대해 더 빠른 다른 솔루션이있을 수 있습니다. – Georgi

+0

멋진 링크, 감사합니다! –

1

문자열을 배열에 푸시 한 다음 배열에 조인하는 것이 JavaScript에서 문자열 연결을위한 가장 빠른 기술이라고 생각합니다. 이 discussion about W3C DOM vs. innerHTML에는 몇 가지 근거가 있습니다. innerHTML 1과 innerHTML 2 결과의 차이점에 유의하십시오.

1

내가 아는 한, 귀하의 알고리즘은 문자열 결합 문제에 대한 성능있는 솔루션으로 잘 알려져 있습니다.

0

IE 불량 가젯 수집기에주의하십시오! 사용 후 어레이로 무엇을 할 생각입니까? 아마 GC'd를 얻을 것인가?

조인으로 연결하면 perfornace를 얻을 수 있으며 post-GC'ing에서는 잃을 수 있습니다. 반면 배열을 항상 범위에두고 재사용하지 않으면 좋은 해결책이 될 수 있습니다.

개인적으로 가장 간단한 해결책을 원합니다. + = 연산자 만 사용하십시오.

+0

내 대답에 무슨 문제가 있는지 궁금합니다! – Thevs

0

buffering으로 조금 더 빨라질 수 있습니다.

+0

연결하려는 문자열 수가 알려지지 않았기 때문에 ("알 수없는 문자열의 경우 ...") 죄송합니다. 나는 버퍼링에 대해서도 생각했지만 이것은 메모리 사용량과 가비지 수집을 크게 증가시킬 것이다. – Georgi

관련 문제