자바스크립트에서 문자열을 합치는 방법

어제 워크샵에서 배운 것들을 이것 저것 해보는 중인데 그 중 StringBuffer의 성능에 대해 간단히 벤치마킹 해본 결과를 적어본다. 진작에 좀 알았으면 좋았을 것을..;

자바스크립트에서 두 문자열을 하나로 합치고 싶을때는 + 연산자로 간단히 합칠 수 있다. 다른 언어에서도 마찬가지지만 좀 저수준에서 바라보면 문자열을 합치는 작업은 앞쪽 문자열의 끝부분을 찾아서 그 뒤에 뒤쪽 문자열을 붙이는 방법이기 때문에 앞쪽 문자열이 길수록 작업시간이 늘어난다. 그래서 거대한 양의 HTML 코드를 동적으로 생성해 + 연산자로 이어붙여 innerHTML 메소드로 넣어줄때는 문자열이 길어질 수록 길이의 제곱에 비례해 시간이 늘어나는 걸 볼 수 있다.

자바의 경우는 이 문제를 StringBuffer라는 객체를 사용해 해결한다. 일정 공간의 버퍼를 만들고 여기에 문자열을 추가하면서 버퍼가 모자라면 지금 할당된 버퍼의 용량을 두배로 늘려 사용하는 단순한 방법인데 속도가 상당히 향상된다.

자바스크립트에서는 메모리를 직접 다루는게 불가능하기 때문에 이런 방법은 쓰기 힘들고, 추가할 문자열을 실제로 이어붙이는게 아니라 배열에 임시로 넣어두었다가 필요할때 합쳐서 쓰는 방법을 사용한다. 배열에 문자열을 집어넣는건 문자열의 길이와 상관없이 항상 일정한 시간이 걸리기 때문에 최종적으로 문자열을 하나로 합치는 시간에서만 문자열의 길이에 비례한 시간이 소요된다.

Example. http://crizin.net/work/demo/stringBufferExample.html

prototype을 선언해서 좀 더 우아하게 쓸 수도 있다.

Example. http://crizin.net/work/demo/stringBufferPrototypeExample.html (참고 : Java Script String Buffer)

아무튼 저런식으로 문자열을 다루면 극한 상황일수록 많은 시간을 줄일 수 있게된다. IE의 경우에는 대략 몇십배씩 차이가 나는데 파이어폭스나 오페라 같은 경우는 두 방법의 차이가 거의 없다. 아마 내부적으로 + 연산자를 StringBuffer로 처리하는게 아닌가 추측됨. (오페라의 경우에는 최적화가 잘 돼 있는지 오히려 + 연산자가 더 빠르다)

Demo : http://crizin.net/work/demo/stringBenchmark.html

그래서 결론은 IE7이 빨리 나오길 바란다는 것으로 마무리;;

포맷하지 마세요

포맷은 디스크에 있는 파일을 몽땅 지울때 쓰는 말이다. 하지만 적지않은 수의 사람들이 포맷 = 윈도우 재설치 라는 개념으로 알고 있는 듯 한데 이건 좀 잘못돼있다. 윈도우 설치에는 포맷, 그러니까 하드디스크의 파일을 몽땅 지우는 작업이 필요 없다. 그래서 쓸데없이 파일들을 다른 드라이브에 백업해둘 필요도 없고 애초에 OS용, 데이터용 하는 식으로 파티션을 나눠둘 필요도 없다. 250GB 하드면 그냥 250GB 모두 하나의 파티션으로 쓰면 된다. (파티션은 나눌수록 비효율적이다) 내가 Windows 98를 설치하는 방법을 예로 들면,

  1. 미리 준비한 부팅디스크로 부팅한다
  2. 윈도우가 설치된 드라이브로 이동해 Windows, Program Files, My Documents 디렉토리의 이름을 각각 _win, _pro, _mydoc 등으로 바꾼다. (지우는게 아니다)
  3. 쓸데없이 깔끔떠는 성격인 관계로 Recycled 디렉토리, 루트의 숨은 파일들을 몽땅 지워준다
  4. 이제 윈도우를 설치한다. CD로 설치해야 한다면 시간이 오래걸리니 Win98 디렉토리를 미리 하드로 복사해놓고 설치하면 좋다.
  5. 윈도우 설치가 끝나면 백업해놓은 _win, _pro, _mydoc 디렉토리에서 즐겨찾기, 프로그램의 세팅 파일 등등 잡다한걸 복구시킨다.
  6. 완벽히 설치가 끝나도 백업해놓은 디렉토리는 당분간 지우지 않는다. 지금 지워버리면 분명 며칠후에 백업하지 못한 파일이 생각나게 마련.

Windows 2000, 2003, XP 등은 위와 거의 같은 방법이지만 파일 시스템이 NTFS인 관계로 NTFS 드라이버가 포함된 부팅디스크나 Windows PE 같은걸 이용해야 한다는 점만 다르다. (NTFS 부팅디스크는 구글 뒤지면 나옴)

  1. NTFS 지원 부팅디스크, 또는 Windows PE 등으로 부팅한다
  2. 윈도우가 설치된 드라이브로 이동해 Windows, Program Files, Documents and Settings 디렉토리의 이름을 다른 이름으로 바꿔놓는다
  3. 잡다한 디렉토리들(Recycler, System Volume Information, 루트의 파일 몽땅)을 지워준다
  4. 윈도우 설치. 얘들은 i386 디렉토리를 하드에 복사해서 설치해도 되지만 이것도 시간이 만만치 않게 걸리기때문에 그냥 CD로 설치하는게 낫다.
  5. 설치가 끝나면 위와 같이 각종 파일들 복구

하드디스크 용량이 부족해서 이전의 윈도우를 지우지 않고 새로 설치하는게 어려운 경우가 아니면 위의 방법으로 백업, 설치 하는걸 강력히 권장한다. 심지어 새로 설치한 윈도우가 마음에 들지 않는다면 예전의 윈도우로 다시 돌아갈 수도 있다. 나중에 완전히 복구가 끝나서 예전의 윈도우를 지운 뒤에 조각모음이나 한번 해주면 금상 첨화..

그리하여 10년전 첫 컴퓨터에 Windows 3.1을 설치할때부터 지금까지 하드디스크 새로 구입할때 말고는 포맷해본 적이 없다. 딱한번 디스크 용량이 모자라서 백업하지 않고 윈도우 삭제후 설치한적이 있는데 이때 수년간 모아온 아웃룩 메일을 몽땅 날려버렸다 -┎ 그 뒤로 윈도우 새로 설치한다고 포맷하는 사람들 보면 열심히 뜯어말리는 버릇이 생겼다는 가슴아픈 얘기..; 사실 사람들에게 일일이 말해주기 귀찮아서 이렇게 써놓고 보여주려는 목적이었으나 써놓고보니 뭔가 좀 설득력도 없고-_- 나중에 스크린샷이라도 추가해서 제대로 써봐야겠다.

'컴퓨터 얘기 > 시시한얘기' 카테고리의 다른 글

웹 어플리케이션의 보안  (5) 2005/07/22
CSS 디자인에 대한 거부감  (25) 2005/07/13
포맷하지 마세요  (13) 2005/07/06
CSS를 이용한 웹사이트 디자인 전략  (10) 2005/07/05
요상한 입력툴 Dasher  (4) 2005/05/17
Decimal 1 day  (3) 2005/03/18
태그 :