보통 배열을 쓸 때

배열을 다시 짜거나 초기화 시켜야할 때 다음과 같이 많이 쓰죠.

arr = [];

하지만 다음과 같이 사용하면 약 3배 정도 퍼포먼스를 향상시킬 수 있습니다.

arr.length = 0;

length가 read-only라고 생각하고 계셨을 수도 있지만 length 값은 read-write 입니다.

배열의 길이를 0으로 해버리면 모든 원소를 날리고 초기화가 됩니다.

[] 명령어 자체도 new 와 마찬가지이기 때문에

새로운 객체를 만드는 것보다는 길이를 줄이는게 빠른 요인인것 같습니다.

다음과 같이 몇가지 테스트를 더 해봤습니다.

import flash.utils.getTimer;

function test1(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     arr = [];
    
     return arr.length;
}

function test2(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     arr.length = 0;
    
     return arr.length;
}

function test3(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     arr = new Array();
    
     return arr.length;
}

function test4(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     while( arr.length )
          arr.pop();
         
     return arr.length;
}

function test5(): int
{
     var arr: Array = [ 1, 2, 3, 4, 5 ];
    
     while( arr.length )
          arr.shift();
         
     return arr.length;
}

function test( $function: Function ): void
{
     var i: int = 1000000;
     var time: int = getTimer();
     while( i-- )
          $function();
    
     trace( getTimer() - time );
}

test( test1 );
test( test2 );
test( test3 );
test( test4 );
test( test5 );

결과값

1023
815
1596
1476
1991

당연하겠지만 shift가 가장 느리고 length = 0 이 가장 빨랐습니다.

여기서 초기에 공통적으로 생성해주는 부분이 약 700 ms 소모되므로 초기화하는 과정만 시간을 따로 떼어내면

323
115
896
776
1291

이라는 수치로 바뀝니다.

즉 [] 로 초기화 시키는 것 보다 length = 0 으로 해주는 것이 약 1/3 시간 밖에 걸리지 않습니다.

유후~

메모리도 많이 줄어들것이라고 예상합니다.

유후~



For the better

+ Recent posts