Home | Experience | Guestbook | Admin | About
 
http://blogs.msdn.com/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx
이곳에 소개된 String Array.join에 대한 내용을 보고 정말 그런가 해서 한번 테스트 해보았다.

 F   ? 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="text/javascript">
var stime = new Date().getTime();
var str = '';
for(var i = 0; i<50000; i++) {
str += i+', ';
}
alert(new Date().getTime()-stime); // 14328(14초)
document.write(str);

stime = new Date().getTime();
var strs = [], str2 = '';
for(var i = 0; i<50000; i++) {
strs.push(i+', ');
}
str2 = strs.join('');
alert(new Date().getTime()-stime); // 266(0.2초)
document.write(str2);
</script>


이것은 String 조작에서 일반적으로 사용되는 + 연산자로 값을 추가하는것과 배열의 join을 이용하여 값을 추가하는것의
예시이다.

위의 결과에서 보자면 엄청난 차이다.
이건 데이트가 많아지면 많아질수록 그 차이는 극명하다.
배열을 사용했을때는 거의 1초이상이 넘어가질 않는다.
참고로 1백만 데이터( 1M byte) 의 텍스트를 평가한다면 현재 내컴에서는 string 연산자에서는 컴터가 다운된다.

요약해보자면 IEBlog에서 얘기하고자 하는 주된골자는 JScript에서 String에서 중간 처리값은 메모리의 힙과 가비지컬렉션의 포인터에
위치해 있고. 내부에서 이미 Array.join으로 구현을 하고 있다는 것이다.
그래서 쓸데없이 오버헤드가 발생한다는 논리이다.
흠..이런 사실이 숨어있었단 말인가?

역시 IE는 참 사람을 힘들게 한다.ㅡㅡ; ie8버젼에서는 좀 개선이 되었을런지...

참고로 FF폭스에서는 23 / 117로 아주성능이 양호했다. 오히려 Array.join이 더 느려지는 현상이 발생했으니...

이번에는 그래서 AS도 한번테스트 해보았다. 환경은 AS3.0 (FlashPlayer 10)..
그런데 놀랍다.
플래시의 수행속도가 JS의 10배가 넘어간다.
50000으로 테스트하는건 도저히 수행속도가 너무빨라 힘들어서 JS의 2배인 100000으로 테스트해보았다.
음..별차이없다..
그런데 놀라운 사실은 또 있었다.

AS test1
 F   ? 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var tf1 = addChild(new TextField()), tf2 = addChild(new TextField());
tf1.autoSize = tf2.autoSize = 'left';

var stime:Number = getTimer();
var str:String = '';
for(var i:int = 0; i<100000; i++) {
str += i+', ';
}
trace(getTimer()-stime); // 119
tf1.text = str;

stime = getTimer();
var strs:Array = [], str2:String = '';
for(i = 0; i<100000; i++) {
strs.push(i+', ');
}
str2 = strs.join('');
trace(getTimer()-stime); // 118
tf2.text = str2;


AS test2
 F   ? 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var tf1 = addChild(new TextField()), tf2 = addChild(new TextField());
tf1.autoSize = tf2.autoSize = 'left';

var stime:Number = getTimer();
var str:String = '';
for(var i:int = 0; i<500000; i++) {
str += i+', ';
}
trace(getTimer()-stime); // 558
tf1.text = str;

stime = getTimer();
var strs:Array = [], str2:String = '';
for(i = 0; i<500000; i++) {
strs.push(i+', ');
}
str2 = strs.join('');
trace(getTimer()-stime); // 928
tf2.text = str2;


이번엔 JS테스트의 10배인 50만번테스트에서 반대로 Array.join이 더 높게 나왔다.
흠...확실히 AS의 성능향상은 비약적이다.
여기서 보면 알겠지만 AS에서 String 처리는 JS와 다르다는것을 알수 있다. 메모리 힙에 직접접근한다고 볼수도...
그래서 다시 마지막 테스트인 Vector로 테스트해보겠다.

AS test3
 F   ? 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var tf1 = addChild(new TextField()), tf2 = addChild(new TextField());
tf1.autoSize = tf2.autoSize = 'left';

var stime:Number = getTimer();
var str:String = '';
for(var i:int = 0; i<500000; i++) {
str += i+', ';
}
trace(getTimer()-stime); // 533
tf1.text = str;

stime = getTimer();
var strs:Vector.<String> = new Vector.<String>(), str2:String = '';
for(i = 0; i<500000; i++) {
strs.push(i+', ');
}
//str2 = strs.join('');
trace(getTimer()-stime); // 974
tf2.text = str2;


vector를 테스트 해보아도 String이 더 빠르다는 것을 확인할 수 있다.
결론은 AS>JS인가?
원래 포스트의 목적은 이게아니였는데..쿨럭;;
EDIT | DELETE
LINK • SUMMARY