[ActionScript 3, Flex]되도록이면 직접적인 Object 클래스 사용을 지양해야하는 이유
[공지]이미지나 링크가 깨졌다면 댓글 부탁드립니다.
몇 일전 "RemoteClass 메타데이타 태그(Metadata tag) 사용시 매핑(mapping)이 안되나요? "라는 글을 적은 적이 있다.
이 글 중간에 아래와 같이 언급했다.
"RemoteClass 메타데이타 태그를 사용하지 않으면 Flex는 어떤형인지 알지 못해 그냥 Object 값으로 받아와 버립니다. 물론 사용할 수 있지만 Object 특성상 포퍼먼스에 제약이 있고 또한 Object를 이용하면 탄탄한 설계 바탕이라고 말할 수 없겠지요."
일반 Object와 구체적으로 정의된 Object의 포퍼먼스에 대한 차이를 언급하고 있는 부분이다.
실제로 대용량의 데이터를 만들어 사용한다고 했을때 과연 Object와 구체적으로 정의된 Object의 엑세스 속도차이는 얼마나 될까?
간단한 실험을 위해 구체적 정의된 Object는 다음과 같이 만들었다.
package
{
public class ConcreteObject
{
public var param1:Number;
public var param2:Number;
public var param3:Number;
public var param4:Number;
public var param5:Number;
public var param6:Number;
public function ConcreteObject( p1:Number, p2:Number, p3:Number, p4:Number, p5:Number, p6:Number )
{
param1 = p1;
param2 = p2;
param3 = p3;
param4 = p4;
param5 = p5;
param6 = p6;
}
}
}
Object와 ConcreteObject의 엑세스 비용을 계산하기 위해 아래와 같이 코딩하였다.
package {
import flash.display.Sprite;
import flash.utils.getTimer;
public class ObjectTest extends Sprite
{
public function ObjectTest()
{
var totalCount:Number = 1000000;
var objectList:Array = []; //일반 Object를 담는 Array
var concreteObjectList:Array = []; //구체적으로 만든 오브젝트를 담는 Array
var i:int;
var object:Object;
var concreteObject:ConcreteObject;
//일반 오브젝트 Array 생성
var s:Number = flash.utils.getTimer();
for( i=0; i<totalCount; i++)
{
object = {param1:i, param2:i, param3:i, param4:i, param5:i, param6:i};
objectList.push( object );
}
var t1:Number = flash.utils.getTimer() - s;
//구체적인 정의 오브젝트 Array 생성
s = flash.utils.getTimer();
for( i=0; i<totalCount; i++)
{
concreteObject = new ConcreteObject( i, i, i, i, i, i );
concreteObjectList.push( concreteObject );
}
var t2:Number = flash.utils.getTimer() - s;
var p1:Number;
var p2:Number;
var p3:Number;
var p4:Number;
var p5:Number;
var p6:Number;
//일반 오브젝트 Array 엑세스
s = flash.utils.getTimer();
for each( object in objectList )
{
p1 = object.param1;
p2 = object.param2;
p3 = object.param3;
p4 = object.param4;
p5 = object.param5;
p6 = object.param6;
}
var t3:Number = flash.utils.getTimer() - s;
//구체적인 정의 오브젝트 Array 엑세스
s = flash.utils.getTimer();
for each( concreteObject in concreteObjectList )
{
p1 = concreteObject.param1;
p2 = concreteObject.param2;
p3 = concreteObject.param3;
p4 = concreteObject.param4;
p5 = concreteObject.param5;
p6 = concreteObject.param6;
}
var t4:Number = flash.utils.getTimer() - s;
trace( "일반 오브젝트의 생성 시간 :" + t1 + "ms");
trace( "구체적 정의 오브젝트 인스턴스의 생성 시간 :" + t2 + "ms");
trace( "일반 오브젝트의 엑세스 시간 :" + t3 + "ms");
trace( "구체적 정의 오브젝트의 엑세스 시간 :" + t4 + "ms");
}
}
}
아래는 결과이다.
100000 개(십만개)
일반 오브젝트의 생성 시간 :218ms
구체적 정의 오브젝트 인스턴스의 생성 시간 :172ms
일반 오브젝트의 엑세스 시간 :110ms
구체적 정의 오브젝트의 엑세스 시간 :31ms
1000000개(백만개)
일반 오브젝트의 생성 시간 :2766ms
구체적 정의 오브젝트 인스턴스의 생성 시간 :1828ms
일반 오브젝트의 엑세스 시간 :1016ms
구체적 정의 오브젝트의 엑세스 시간 :328ms
본인의 판단은 이렇다.
1. 속도적인 측면에서 볼 때 되도록 구체적으로 정의된 오브젝트를 만들고 AMF통신때는 RemoteClass 메타데이타 태그(또는 registerClassAlias() 메소드)를 써야한다.
2. Object를 사용하면 Flex Builder등의 에디터에서 코딩할때 변수 참조를 못하는 불편함이 있다.
3. Object를 사용했다는 것은 튼튼한 설계 바탕으로 만들었다고 생각하기 곤란하다. 명확한 데이터를 주고 받아야하는 경우에 Object 사용은 어떤 데이타가 오고 가는지 명확히 판단할 수 있는 기준을 무너뜨릴 수 있다.
참고글
RemoteClass 메타데이타 태그(Metadata tag) 사용시 매핑(mapping)이 안되나요?
글쓴이 : 지돌스타(http://blog.jidolstar.com/399)
'Adobe Flash Platform' 카테고리의 다른 글
| [Flex/Javascript] 다중 파일 업로더(multi file uploader) 기능을 추가했습니다. (13) | 2008/11/14 |
|---|---|
| Google Open Social과 Flex의 결합. 3D 케릭터 만들기 BuddyPoke (10) | 2008/11/03 |
| [ActionScript 3, Flex]되도록이면 직접적인 Object 클래스 사용을 지양해야하는 이유 (6) | 2008/10/27 |
| [Flex,Javascript] 더욱 가벼워진 "다중 파일 업로더" 소스 공개, Flash Player 10 대응 (2) | 2008/10/26 |
| [Flash Player 10]FileReference의 변경된 보안정책과 새롭게 추가된 기능에 대한 나의 생각 (4) | 2008/10/26 |
| [Flex,Javascript]다중 파일 업로더(Multi file uploader) -소스공개,Flash Player 10 환경 적용 (4) | 2008/10/25 |




언제나 그렇듯이 자세한 답변감사드려요~ ㅎㅎ
별말씀을... 제가 금방 해볼 수 있는거라 ^^
와우 멋지네요 (^^)
ㅎㅎㅎ 그냥 테스트라~ ^^
언제나 멋진 강좌 감사드립니다~ ㅎㅎ ^^
감사합니다.
하지만 제 블로그에 올리는 내용은 강좌라기 보다는 정리이고 공유입니다. ^^