본문 바로가기

AS3/Tip

Array 와 Vector의 속도차이

Vector 클래스를 사용하면 Array 클래스보다 읽기 및 쓰기 액세스가 빠릅니다.

간단한 벤치마크를 실행해 보면 Array 클래스 대비 Vector 클래스의 이점이 크다는 것을 알 수 있습니다. 다음 코드는 Array 클래스에 대한 벤치마크를 보여 줍니다.

var coordinates:Array = new Array(); 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 300000; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
  
trace(getTimer() - started); 
// output: 107 

다음 코드는 Vector 클래스에 대한 벤치마크를 보여 줍니다.

var coordinates:Vector.<Number> = new Vector.<Number>(); 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 300000; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
 
trace(getTimer() - started); 
// output: 72 

이 예제는 벡터에 특정 길이를 할당하고 해당 길이를 고정된 값으로 설정하여 좀 더 최적화할 수 있습니다.

// Specify a fixed length and initialize its length 
var coordinates:Vector.<Number> = new Vector.<Number>(300000, true); 
  
var started:Number = getTimer(); 
  
for (var i:int = 0; i< 300000; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
 
trace(getTimer() - started); 
// output: 48 

벡터의 크기를 사전에 지정하지 않은 경우 벡터의 공간이 부족해지면 크기가 증가합니다. 벡터의 크기가 증가할 때마다 새로운 메모리 블록이 할당됩니다. 벡터의 현재 내용은 새로운 메모리 블록에 복사됩니다. 이러한 추가 할당 및 데이터 복사는 성능에 좋지 않은 영향을 줍니다. 위 코드는 벡터의 초기 크기를 지정하여 성능을 위해 최적화되어 있습니다. 그러나 유지 관리 면에서는 이 코드가 최적화되어 있지 않습니다. 유지 관리 편의성도 향상시키려면 다음과 같이 다시 사용되는 값을 상수로 저장하십시오.

// Store the reused value to maintain code easily 
const MAX_NUM:int = 300000; 
  
var coordinates:Vector.<Number> = new Vector.<Number>(MAX_NUM, true); 
var started:Number = getTimer(); 
  
for (var i:int = 0; i< MAX_NUM; i++) 
{ 
    coordinates[i] = Math.random()*1024; 
} 
  
trace(getTimer() - started); 
// output: 47