<출처 : http://asduck.kr/ >
performance & optimization 관련하여 조사한 자료들을 정리해 보았다.
기존에 알던 것들도 있고, 새롭게 알게 된 것들도 있다.
하나하나가 크게 영향을 미치진 않겠지만 이러한 코딩 습관들이 모이다 보면 결과적으론 performance 에 좋은 영향을 미치리라 생각한다.
1. Declaration of variable type ( 변수의 타입 선언 )
2. Avoid implicit types conversion of numeric types( 강제 형변환 회피 )
3. If you are going to access a property, variable, or a function value more than a few times, store that value in a local var ( 중복해서 쓰이는 값, 함수.. 등은 변수로 저장해서 사용하는 것이 좋다 )
4. Avoid variable declaration inside loops ( 반복문 안에서의 변수 선언은 피해라 )
5. Cast instances, while reading from Array ( 배열값에 접근시, 배열 요소의 type 으로 변환해서 접근해라 )
6. Bit operation are faster than normal operators ( bit 연산을 사용해라 )
7. Don’t use constants ( 상수를 사용하지 말아라 - adobe 개발자의 팁 )
8. Avoid the new operator when creating Arrays ( 배열 생성시 new 연산자를 피해라 )
9. Use static for properties methods that do not require an object instance
10. Use final when no subclasses need to be created of a class
( 더이상 변하지 않는 클래스는 final 로 선언 )
11. Rank your if statements in order of comparisons most likely to be true
( if 구문에서 가장 빈번하게 발생하는 조건문순으로 체크해라 )
12. Use uint sparingly, it can be slow (VM has been changing, from 9 to 10, so int, uint and number conversions aren't as slow as they used to be.)
( uint 사용을 줄여라 )
13. Use RegEx for validation, use string methods for searching
( 유효성 체크를 위해선 정규표현식을, 검색을 위해선 string 을 사용해라 )
14. Code against ENTER_FRAME events instead of Timer events( Timer 대신 Enterframe 을 사용해라 )
15. Alpha = 0 is not the same as visible = false (Objects marked invisible are passed over)
※ No difference in memory usage between an if statement and a switch statement ( if 와 switch는 메모리 사용성에 있어서 차이가 없다 )
퍼포먼스 면에서 보면 if 가 계산속도가 빠르나, 비교값이 int 인 경우 switch 의 속도가 더 빠르다.
※ One line assignments DO NOT buy any performance
( 한줄에 여러 연산을 써도 퍼포먼스에 영향이 없다 )
※ Length of method/variable names doesn't matter in ActionScript 3.0
( 메소드명, 변수명의 길이가 문제가 되지 않는다 )
스크롤의 압박이 ^-^ ;;
위의 내용들은 테스트 환경 및 방법에 따라 맞는 것도 있고, 아닐 수도 있다.
하지만 일반적인 환경에서는 위와 같은 코딩습관을 갖는것이 오히려 많은 도움이 될거라고 생각한다.
[ 참고자료 ]
http://gamedevjuice.wordpress.com/2008/02/15/seven-tips-about-performance-optimization-in-actionscript-3/
http://overfloweb.com/zbxe/study/465
http://www.insideria.com/2009/04/51-actionscript-30-and-flex-op.html
<출처 : http://asduck.kr/ >
performance & optimization 관련하여 조사한 자료들을 정리해 보았다.
기존에 알던 것들도 있고, 새롭게 알게 된 것들도 있다.
하나하나가 크게 영향을 미치진 않겠지만 이러한 코딩 습관들이 모이다 보면 결과적으론 performance 에 좋은 영향을 미치리라 생각한다.
1. Declaration of variable type ( 변수의 타입 선언 )
var num:Number;
var str:String;
var str:String;
2. Avoid implicit types conversion of numeric types( 강제 형변환 회피 )
var num:int = 10;
Math.sqrt( num );
//** Math.sqrt( num:Number ) 이므로 위와 같이 타입이 다른 변수의 대입은 피하는것이 좋다.
Math.sqrt( num );
//** Math.sqrt( num:Number ) 이므로 위와 같이 타입이 다른 변수의 대입은 피하는것이 좋다.
3. If you are going to access a property, variable, or a function value more than a few times, store that value in a local var ( 중복해서 쓰이는 값, 함수.. 등은 변수로 저장해서 사용하는 것이 좋다 )
var fname:String = person.firstName;
if (fname == “Matt” || fname == “Ted” || fname == “Alex”)
{
if (fname == “Matt” || fname == “Ted” || fname == “Alex”)
{
......
}
[ NOT ]
var person:Person;
if (person.firstName == “Matt” || person.firstName == “Ted” || person.firstName == “Alex”)
{
[ NOT ]
var person:Person;
if (person.firstName == “Matt” || person.firstName == “Ted” || person.firstName == “Alex”)
{
......
}
4. Avoid variable declaration inside loops ( 반복문 안에서의 변수 선언은 피해라 )
var i:int;
var num:Number;
for( i=0; i<100; i++ )
{
var num:Number;
for( i=0; i<100; i++ )
{
num = Math.random();
}
[ NOT ]
var i:int;
for( i=0; i<100; i++ )
{
[ NOT ]
var i:int;
for( i=0; i<100; i++ )
{
var num:Nmber = Math.random();
}
5. Cast instances, while reading from Array ( 배열값에 접근시, 배열 요소의 type 으로 변환해서 접근해라 )
var arrPoint:Array =[ new Point( 10, 10 ), new Point( 5, 9 )];
var i:int;
var max:int = arrPoint.length;
var point:Point;
var xPos:int;
for( i=0; i<max; i++ )
{
var i:int;
var max:int = arrPoint.length;
var point:Point;
var xPos:int;
for( i=0; i<max; i++ )
{
point = arrPoint[i] as Point;
xPos = point.x;
xPos = point.x;
}
[ NOT ]
var arrPoint:Array =[ new Point( 10, 10 ), new Point( 5, 9 )];
var i:int;
var max:int = arrPoint.length;
for( i=0; i<max; i++ )
{
[ NOT ]
var arrPoint:Array =[ new Point( 10, 10 ), new Point( 5, 9 )];
var i:int;
var max:int = arrPoint.length;
for( i=0; i<max; i++ )
{
var xPos:int = arrPoint[i].x;
}
6. Bit operation are faster than normal operators ( bit 연산을 사용해라 )
var val1:int = 4 << 1;
var val2:int = 4 << 2;
var val3:int = 4 >> 1;
var val4:int = 4 >> 2;
[ NOT ]
var val1:int = 4 * 2;
var val2:int = 4 * 4;
var val3:int = 4 / 2;
var val4:int = 4 / 4;
//** 참고로 나누기 연산 대신 곱하기 연산을 사용하는 것이 좋다.
Multiply vs. Divide: instead of 5000/1000 use: 5000*0.001
var val2:int = 4 << 2;
var val3:int = 4 >> 1;
var val4:int = 4 >> 2;
[ NOT ]
var val1:int = 4 * 2;
var val2:int = 4 * 4;
var val3:int = 4 / 2;
var val4:int = 4 / 4;
//** 참고로 나누기 연산 대신 곱하기 연산을 사용하는 것이 좋다.
Multiply vs. Divide: instead of 5000/1000 use: 5000*0.001
7. Don’t use constants ( 상수를 사용하지 말아라 - adobe 개발자의 팁 )
const SPEED:int = 5;
//** adobe 개발자의 팁이라고 하는데 이부분에 있어선 장단점이 있다.
//** 상수 대신 실제 값을 사용한다면 퍼포먼스의 개선은 될수 있으나. 코드 관리면에선
깔끔함이 사라지는 것을 감안해야 한다.
//** 나의 경우는 보통 유지 보수나 수정의 용이성을 위해 오히려 const 의 사용을 즐기는
편이긴 하지만, 가급적 필요한 변수에 제한시킨다.^-^
//** adobe 개발자의 팁이라고 하는데 이부분에 있어선 장단점이 있다.
//** 상수 대신 실제 값을 사용한다면 퍼포먼스의 개선은 될수 있으나. 코드 관리면에선
깔끔함이 사라지는 것을 감안해야 한다.
//** 나의 경우는 보통 유지 보수나 수정의 용이성을 위해 오히려 const 의 사용을 즐기는
편이긴 하지만, 가급적 필요한 변수에 제한시킨다.^-^
8. Avoid the new operator when creating Arrays ( 배열 생성시 new 연산자를 피해라 )
var arr:Array = [];
[ NOT ]
var arr:Array = new Array();
[ NOT ]
var arr:Array = new Array();
9. Use static for properties methods that do not require an object instance
StringUtils.trim( "text with space at end " );
Class definition:
package
{
public final class StringUtils
{
public static function trim( s : String ) : String
{
var trimmed : String;
// implementation...
return trimmed;
}
}
}
//** 아마도 instance 의 method 보다 static method 사용이 낫다 라는 말인듯하다.
//** 위와 같은 경우는 보통 프로젝트에서 공통으로 사용되는 method 나 변수.. 들을
유틸 클래스 하나에 공통으로 모아서 static 으로 사용하는 방식인거 같다.
나 역시 프로젝트 별로 Utils Class 생성하여 이렇게 사용하고 있는데 퍼포먼스
높인다기 보단, 사용의 편리성 때문인게 더 크다 ^-^
Class definition:
package
{
public final class StringUtils
{
public static function trim( s : String ) : String
{
var trimmed : String;
// implementation...
return trimmed;
}
}
}
//** 아마도 instance 의 method 보다 static method 사용이 낫다 라는 말인듯하다.
//** 위와 같은 경우는 보통 프로젝트에서 공통으로 사용되는 method 나 변수.. 들을
유틸 클래스 하나에 공통으로 모아서 static 으로 사용하는 방식인거 같다.
나 역시 프로젝트 별로 Utils Class 생성하여 이렇게 사용하고 있는데 퍼포먼스
높인다기 보단, 사용의 편리성 때문인게 더 크다 ^-^
10. Use final when no subclasses need to be created of a class
( 더이상 변하지 않는 클래스는 final 로 선언 )
public final class StringUtils
11. Rank your if statements in order of comparisons most likely to be true
( if 구문에서 가장 빈번하게 발생하는 조건문순으로 체크해라 )
if ( conditionThatHappensAlot )
{
// logic to handle frequently met condition
}
else if ( conditionThatHappensSomtimes )
{
// handle the case that happens occaisonally
}
else
{
// handle the case that doesn’t happen that often
}
{
// logic to handle frequently met condition
}
else if ( conditionThatHappensSomtimes )
{
// handle the case that happens occaisonally
}
else
{
// handle the case that doesn’t happen that often
}
12. Use uint sparingly, it can be slow (VM has been changing, from 9 to 10, so int, uint and number conversions aren't as slow as they used to be.)
( uint 사용을 줄여라 )
var footerHex : uint = 0x00ccff;
13. Use RegEx for validation, use string methods for searching
( 유효성 체크를 위해선 정규표현식을, 검색을 위해선 string 을 사용해라 )
//** postal code validation example using regular expressions
private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;
private function validatePostal( event : Event ) : void
{
if( regEx.test( zipTextInput.text ) )
{
// handle invalid input case
}
}
//** search a string using String methods
var string : String = "Search me";
var searchIndex : int = string.indexOf( "me" );
var search : String = string.substring( searchIndex, searchIndex + 2 );
private var regEx:RegExp = /^[A-Z][0-9][A-Z] [0-9][A-Z][0-9]$/i;
private function validatePostal( event : Event ) : void
{
if( regEx.test( zipTextInput.text ) )
{
// handle invalid input case
}
}
//** search a string using String methods
var string : String = "Search me";
var searchIndex : int = string.indexOf( "me" );
var search : String = string.substring( searchIndex, searchIndex + 2 );
14. Code against ENTER_FRAME events instead of Timer events( Timer 대신 Enterframe 을 사용해라 )
public function onEnterFrame( event : Event ) : void
{
}
private function init() : void
{
addEventListener( Event.ENTER_FRAME, onEnterFrame );
}
[ NOT ]
public function onTimerTick( event : Event ) : void
{
}
private function init() : void
{
var timer : Timer = new Timer();
timer.start();
timer.addEventListener( TimerEvent.TIMER, onTimerTick );
}
{
}
private function init() : void
{
addEventListener( Event.ENTER_FRAME, onEnterFrame );
}
[ NOT ]
public function onTimerTick( event : Event ) : void
{
}
private function init() : void
{
var timer : Timer = new Timer();
timer.start();
timer.addEventListener( TimerEvent.TIMER, onTimerTick );
}
15. Alpha = 0 is not the same as visible = false (Objects marked invisible are passed over)
loginButton.visible = false;
[ NOT ]
loginButton.alpha = 0;
[ NOT ]
loginButton.alpha = 0;
※ No difference in memory usage between an if statement and a switch statement ( if 와 switch는 메모리 사용성에 있어서 차이가 없다 )
퍼포먼스 면에서 보면 if 가 계산속도가 빠르나, 비교값이 int 인 경우 switch 의 속도가 더 빠르다.
※ One line assignments DO NOT buy any performance
( 한줄에 여러 연산을 써도 퍼포먼스에 영향이 없다 )
var i=0; j=10; k=200;
※ Length of method/variable names doesn't matter in ActionScript 3.0
( 메소드명, 변수명의 길이가 문제가 되지 않는다 )
someCrazyLongMethodNameDoesntReallyImpactPerformanceTooMuch();
스크롤의 압박이 ^-^ ;;
위의 내용들은 테스트 환경 및 방법에 따라 맞는 것도 있고, 아닐 수도 있다.
하지만 일반적인 환경에서는 위와 같은 코딩습관을 갖는것이 오히려 많은 도움이 될거라고 생각한다.
[ 참고자료 ]
http://gamedevjuice.wordpress.com/2008/02/15/seven-tips-about-performance-optimization-in-actionscript-3/
http://overfloweb.com/zbxe/study/465
http://www.insideria.com/2009/04/51-actionscript-30-and-flex-op.html
<출처 : http://asduck.kr/ >