본문 바로가기

Actionscript3.0

Avoid ints in Actionscript

 오랜만에 블로그를 둘러 보다 흥미로운 포스팅을 보았는데요. Actionscript 로 작업할시 숫자 타입의 int 를 사용을 자제 하라는 내용 입니다. 일반적으로 생각하면 int 가 Number 보다 크기가 작으니 int 로 처리 하면 더 빠르다고 생각하는 분들이 많으실텐데요. 이 포스팅에서는 여러 이유를 통해 부정 하고 있습니다.


이유 1. Number 를 사용하는게 int를 사용하는 것 보다 빠르다.

아래 코드를 실행 시키면 어떤 결과가 나올까요? 


public function timingTest() : void
{
	var intTime : Number;
	var numberTime : Number;

	var i : int;
	var j : int = 0;

	intTime = (new Date()).time;
	for (i=0; i<10000000; i++)
		j = (j + 15) / 7;

	intTime = (new Date()).time - intTime;

	var n : Number;
	var m : Number = 0;

	numberTime = (new Date()).time;
	for (n=0; n<10000000; n++)
		m = (m + 15) / 7;

	numberTime = (new Date()).time - numberTime;

	var message : String =
		"int version: " + intTime + "ms\n" +
		"Number version: " + numberTime + "ms";

	Alert.show(message);
}

int 를 사용한 코드 : 331ms

number 를 사용한 코드 : 291ms

 

  조금 의아해 할수도 있는데요. number 가 조금 빠르게 나왔습니다. 여기서는 조금한 차이지만 더 많은 루프를 돌리면 더 많은 차이를 낼 것 입니다. 일반적으로 number 가 더 많은 대역의 숫자를 커버 하기 때문에 연산할때 더 느릴텐데 왜 number 를 사용한 코드가 더 빠르게 나온걸까요? 


 j = ( j + 15 ) / 7;


 연산 비교에 사용된 코드를 보면 나누기 연산을 하고 있습니다. 이 나누기 연산이 number 가 더 빠른 연산 속도를 낼 수 있었던 이유 입니다. 연산이 이루어 질때 시스템은 내부적으로 int 범위 내에서 처리 할 수 없는 것은 number (double) 로 바꾸어 처리 하기 때문에 int - > number 로 변환 하는 처리 비용이 더 들기 때문에 number 가 더 빠른 결과를 낸 것 입니다. 


이유 2. Number 는 더 많은 bit 를 가지고 있다.


Number를 나타내는 데이터 format 은 아래와 같습니다. int 에 비해 더 많은 데이터 범위를 저장 할 수 있고 ( 12 ~ 63 ) 연산이 손실되는 데이터 없이 이루어 집니다. 그 만큼 오차를 줄여서 계산할 수 있다는 의미 입니다. 


 S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

  0 1        11 12                                                63 


실제로 + 연산이나 - 연산에서는 int 를 이용한 연산이 더 빠릅니다. 하지만, number 에 비해서 많이 빠르지 않습니다. 아래 결과를 보면 gskinner 가 "Types in AS3: ints not so fast, uints slow!" 포스팅을 통해 퍼포먼스 테스트를 한 결과 입니다. int 는 number 에 비해 많이 빠르지 않고, 느릴때도 있으니 차라리 데이터 손실 없이 연산이 이루어 지는 number 를 주로 사용하는게 좋다는 내용 입니다.  


Assignment ( var a:TYPE = 0; )
int: 24-45ms
Number: 24-36ms
uint: 25-37ms

Statistically, they look the same, which is to be expected.

Assignment ( var a:TYPE = 0.5; )
int: 56-83ms
Number: 26-43ms
uint: 57-92ms

Predictably, Number is faster for fractional assignments, as the value does not need to be converted to an integer.

Division ( var a:TYPE = i/2; )
int: 60-105ms
Number: 34-64ms
uint: 184-278ms

Number is a much faster type for division, as expected from Sho's post. uint trails badly.

Multiplication ( var a:TYPE = i*2; )
int: 78-129ms
Number: 39-64ms
uint: 207-280ms

Similar results to division. I thought int might perform better as the value would never have to be converted to a float (whereas in division it would).

Addition ( var a:TYPE = i+2; )
int: 31-49ms
Number: 44-55ms
uint: 85-113ms

As expected from the plain iterator test, int is slightly faster for integer addition.

Bitshift ( var a:TYPE = i<<1; )
int: 31-63ms
Number: 61-114ms

uint: 71-130ms 


가장 좋은 방법은 상황에 따라서 Number 와 int 를 골라 쓰는 건데요. 그 판단이 항상 좋을 수는 없으니, 잘 생각해서 써야 할 것 같습니다. 실제로 "Types in AS3: ints not so fast, uints slow!" 의 댓글에서 Number 의 연산 퍼포먼스가 휠씬 떨어 진다는 내용도 있었습니다. 그러면 언제 int 를 사용하면 좋을까요? 


1. 별로 차이가 없겠지만, 메모리를 적게 쓰고 싶을때

2. var i : int = j / 2; 와 같이 int 를 사용할 때

3. 클라이언트와 서버 측의 통신이 이루어 질때 오차를 줄이고 싶을때 


아무리 여러 테스트가 있어도, 정답은 "상황에 따라 맞는 방법을 쓴다." 이네요.




'Actionscript3.0' 카테고리의 다른 글

[AS3] TextField 에 한정된 라인에만 글짜 넣기  (0) 2010.01.12
Factory Pattern (AS3)  (0) 2009.10.25
Actionscript3.0의 DisplayList  (2) 2009.09.22