[Flex, ActionScript 3] ActionScript 계산 속도 최적화 방법
2007/08/15 02:06
[공지]이미지나 링크가 깨졌다면 댓글 부탁드립니다.
ActionScript 코딩을 할 때 Math클래스에 정의된 메소드나 수학연산자를 종종 쓰게 된다.수학메소드와 수학연산자 잘못쓰면 전체 계산 속도를 저하시키게 된다.
조금만 심혈을 기울이면 계산 속도를 2배에서 3배 이상으로 끌어 올릴 수 있다.
아래는 그 방법중에 몇가지를 소개하고 있다.
목차
1. 2로 나눌때 나누기 대신에 Shift 연산자를 사용하자.
2. Math.floor()과 Math.ceil()를 사용하는 대신 int()를 사용하자.
3. Math.abs를 사용하는 대신 *-1를 사용하자.
1. 2로 나눌때 나누기 대신에 Shift연산자를 사용하자
2로 나눌 때, 나누기 연산자 /를 사용하는 것보다. 곱하기 연산자 *로 0.5를 곱하는 것이 속도 개선에 도움을 준다.빠른방법
var n:Number = value *.5;
느린방법
var n:Number = value / 2;
다음은 Test방법이다.
trace출력결과어떠한가? 비록 아주 작은 차이긴 하지만 이것이 쌓이면 2배 이상의 속도 저하도 일으킬 수 있는 것이다.
DivisionTest: 162
MultTest: 110
하지만 이게 전부가 아니다.
2를 곱하는 경우엔 Shift연산자를 사용하면 속도를 더욱 빠르게 할 수 있다. 다음 예제를 보자.
2로 나누는 경우
trace(10 >> 1);
결과 : 5
2를 곱하는 경우
trace(10 << 1);
결과 : 20
위에서 확인할 수 있듯이 2를 곱하거나 나눌때는 << 연산자나 >>연산자를 사용해도 된다.
그럼 이전 예제와 비교하여 속도 Check를 해보자.
trace출력결과Shift 연산자의 속도가 훨씬 빠른 것을 알 수 있다.
ivisionTest: 152
MultTest: 112
BitTest: 63
Check!!!
이제 기억하자. 2로 나누거나 곱하는 경우에는 반드시 Shift 연산자를 사용하자! 단, 사용시에는 Shift 연산자는 다른 연산자에 비해 우선순위가 낮은 편이므로 ()를 잘 이용하자.
2. Math.floor()과 Math.ceil()를 사용하는 대신 int()를 사용하자.
Math.floor()는 인자보다 작은 정수를 반환하는 함수이고, Math.ceil()은 인자보다 큰 정수를 반환하는 함수이다. 이 함수를 사용하는 대신 int()를 사용하면 거의 10배 정도의 속도 개선을 볼 수 있다.빠른방법
var test:int = int(1.5); //값 1
느린방법
var test:Number = Math.floor(1.5); //값 1
빠른방법
var test:int = int(1.5)+1; //값 2
느린방법
var test:Number = Math.ceil(1.5); //값 2
trace출력결과
FloorTest: 1733
UintFloorTest: 176
IntFloorTest: 157
UintCeilTest: 650
IntCeilTest: 384
Check!!!
이제 기억하자. ceil, floor 함수 대신 int()를 사용하자.
3. Math.abs를 사용하는 대신 *-1를 사용하자.
Math.abs() 함수는 인수를 절대값으로 만들어 반환하는 함수이다. 이외로 이 함수가 프로그램 속도를 저하시킨다는 사실을 알았는가? ^^
빠른방법테스트를 해보자.
var nn:Number = -23
var test:Number= nn < 0 ? nn * -1 : nn;
느린방법
var nn:Number = -23
var test:Number = Math.abs(nn);
trace출력결과
ABSTest: 1615
ABSMultTest: 153
Check!!!
이제 기억하자. abs()함수를 사용하는 대신, *-1를 사용하자.
출처 : http://www.rockonflash.com/blog/?p=63
글쓴이 : 지돌스타(http://blog.jidolstar.com/196)
'Adobe Flash Platform' 카테고리의 다른 글
| [Flex] Flex Framework Diagram 및 ActionScript 3 Class Diagram (3) | 2007/08/15 |
|---|---|
| [Flex,Flash] Papervision3D Class Diagram (2) | 2007/08/15 |
| [Flex, ActionScript 3] ActionScript 계산 속도 최적화 방법 (7) | 2007/08/15 |
| [Flex] Papervision3D로 만들어본 3D 오브젝트 (2) | 2007/08/14 |
| [Flex]한글폰트 입력이 가능한 회전하는 Textarea 컴포넌트 만드는 방법 (1) | 2007/08/09 |
| [Flex] 회전하는 컴포넌트 위에 글자가 사라지지 않게 하는 방법 (4) | 2007/08/08 |




/ 2 할일은 많은데 꼭 shift 써야겠네요 ㅎㅎ
하실때 꼭 ()를 사용하세요~~ shift가 연산 우선순위가 낮다는거 기억하심~ ^^
도대체 무슨일을 하시는분이시길래 ㅠ_ㅠ 스킬이 부럽습니다.
C에서나 java에서도 마찬가지인가요?
예~ ^^
2번의 ceil 은 경우에 따라 결과값이 다르게 나옵니다.
Math.ceil(n) == int(n) + 1
n = 1.5 // 2 == 1 + 1
n = 2 // 2 != 2 + 1
그러므로
Math.ceil(n - 0.1) == int(n - 0.1) + 1
해야하지 않을까욤..
모바일 게임 개발하다가 이번에 flex 공부하게된 사람입니다 ㅎㅎ
모바일게임을 하다보면 단말의 열악한 환경때문에 이것저것 최적화 연구를 많이 하게되죠 ^^;;
낡은피아노님이 말씀하신 2번..
ceil 이 소수점 반올림 인가요?
그렇담 그냥 int(n+0.5) 하면 되지않나요?
아님 가까운 정수라면 음수일땐 따로 처리해서 int(n+(n<0?-0.5:0.5)) 등으로... 아닌가? ^^;