마소 9월자에서 최적화에 대한 글을 보았습니다.

물론 다른 언어였지만 for문 최적화에 대한

흥미로운 글이 있었습니다.


우리는 보통 for문을 돌릴때 아래와 같이 돌립니다.

var i: int;
var len: int;

var arr: Array = [];

for( i = 0, len = 100000 ; i < len ; i += 1 )
{
     arr.push( "A" );
}

※ 위 for문 형식이 생소하다면 여기를 참조하세요.

물론 위 구문은 잘못된곳은 없습니다.

잘 돌아가는 구문이죠. 에러도 없고 ㅎㅎ

그렇지만 최적화를 하기 위해서

위의 예문을 아래와 같이 바꿀 수 있습니다.

var i: int;
var len: int;

var arr: Array = [];

for( i = 0, len = 100000 ; i < len ; i += 2 )
{
     arr.push( "A" );
     arr.push( "A" );
}

네 그렇습니다.

for문을 줄이기 위해서 한번에 두개의 실행을 하도록 하였습니다.

그러면 아래 코드로 직접 테스트를 해보겠습니다.

var i: int;
const len: int = 1000000;

var arr: Array = [];               // test array.
var time: int = getTimer();     // variables to record runtime.

for( i = 0 ; i < len ; i += 1 )
{
     arr.push( "A" );
}

trace( getTimer() - time );

결과는

1 - 121
2 - 118
3 - 119
4 - 121
5 - 119

평균 119.6 ms 입니다.

그렇다면 2배수로 최적화시킨 코드로 테스트해보겠습니다.

var i: int;
const len: int = 1000000;

var arr: Array = [];               // test array.
var time: int = getTimer();     // variables to record runtime.

for( i = 0 ; i < len ; i += 2 )
{
     arr.push( "A" );
     arr.push( "A" );
}

trace( getTimer() - time );

결과는

1 - 116
2 - 117
3 - 117
4 - 118
5 - 117

평균 117.0 ms 가 나왔습니다.

약 2.1%의 향상을 가져왔습니다.

테스트된 시간으로 봤을땐 정말 별거 아니지만

군더더기 없는 코드를 향상시킨다는것은 대단한 일입니다.

퍼포먼스가 최우선시 되는 대량 작업이나 3D 좌표계산같은 반복 구문이 많은 코드에서는

매우 효율적인 방법일 것입니다.

지금은 비교적 간단한 코드지만 코드량이 많아지거나 보다 최적화해야할 경우 도움이 될것입니다.

지금은 2배수만 테스트 했지만

4배수 일때는 116.8, 8배수 일때는 117.2가 나와서

4, 8배수 일때는 오히려 느리거나 차이가 없는것으로 나타났습니다.

왜 2의 배수냐구요?

CPU는 2배수의 명령어를 빨리 처리한다고 알려져있다고 합니다.

그래서 이러한 현상이 나타나는 것이겠죠.



참고로 저는 맨처음에는 아래 코드로 테스트했었습니다.

var i: int;
const len: int = 1000000;

var arr: Array = [];               // test array.
var time: int = getTimer();     // variables to record runtime.

for( i = 0 ; i < len ; i += 1 )
{
     arr[ i ] = "A";
}

trace( getTimer() - time );

평균 70ms가 나왔습니다.

아래 코드로 테스트를 했습니다.

var i: int;
const len: int = 1000000;

var arr: Array = [];               // test array.
var time: int = getTimer();     // variables to record runtime.

for( i = 0 ; i < len ; i += 2 )
{
     arr[ i ] = "A";
     arr[ i + 1 ] = "A";
}

trace( getTimer() - time );


평균 86.2ms가 나왔습니다.

오히려 23% 느린 결과입니다.

이 예제가 오히려 마소에서 나왔던 코드입니다. (뭥미 -_-?)

이런 현상은 바로

arr[ i ] = "A";
arr[ i + 1 ] = "A";

구문때문인것으로 생각됩니다.

i + 1 코드가 추가되어서

연산이 그만큼 늘어난것이죠.

i + 1 의 연산속도가 포문 한번 도는것 보다 느리다는 추리가 가능하겠습니다.

여러분들도 꼭 여러분의 코드에

"최적화"코드가 녹아들어있기를 바랍니다^^


'ActionScript 3.0 > 팁 & 노하우' 카테고리의 다른 글

[AS3] 문자열 바이트로 제한하기  (12) 2008.10.23
[AS3] 영역 구하기.  (8) 2008.09.24
[AS3] 몇 초 후에 메소드 실행하기  (23) 2008.09.01
[AS3] 인스턴스의 타입체크하기.  (12) 2008.08.31
[AS3] 이쁜 for문  (21) 2008.08.22

+ Recent posts