2011-12-18 30 views
6

Array'ları Array türünde bir Vector dizisinde depolamanın herhangi bir performans avantajı var mı?AS3 Dizilerin Vektörü

örn Seçenek 1

private var _arrays:Vector.<Array> = new Vector.<Array>(2); 
_arrays[0] = new Array(10); 
_arrays[1] = new Array(10); 
private var _arrays:Array = new Array(2); 
_arrays[0] = new Array(10); 
_arrays[1] = new Array(10); 

Ayrıca ben bir vektör veya vektörler olabilir Seçeneği?

private var _vectors:Vector.<Vector> = new Vector.<Vector>(2); 

_vectors[0] = new Vector.<String>(10); 
_vectors[1] = new Vector.<String>(10); 

sayesinde

Mark

+0

Güncelleştirilmiş yanıtıma bakın @ crooksy88. Orijinal kodumun doğruluğunu gösteren test kodu + sonuçları gönderdim ve weltraumpirat'ın cevabı patentlidir. –

cevap

10

DÜZENLEME

Benim asıl cevap en son kısmı hariç yanlıştı ve bunun için özür dilemek zorunda. Vector'in “başlık altında” dört uygulamaya sahip olduğu gerçeğini biliyordum. (Robert Penner tarafından bir yazı içinde FP 10 playerglobal.swc'den decompiled kaynakları bulabilirsiniz here) Bunlardan üçü sayı türleri (int, uint ve Number) içindir. Biri nesne türleri içindir. Bu sonuncusu bir yakalama işlevi görür ve Nesneden türetilen tüm sınıfları alır. Bu yüzden Vector.<Object>'un the information regarding vectors and arrays available from Adobe'a dayanarak Array'dan daha hızlı olduğunu varsaydım.

Ancak, bu bilgilerin yanlış, ya da en azından bazı önemli bölümlerini dışarıda bırakır gibi görünüyor:

Vector.<AnyClassDerivedFromObject> sıkı yazım için olanak sağlarken, bu tip bilgileri sadece (sen de derleme zamanında değerlendirilir
  1. Daha fazla tip güvenlik elde edin, ancak çalışma zamanında değil - bu nedenle, sıkı yazım nesnesi vektörlerinin faydaları performansa uygulanmaz. Daha fazla bilgi için bkz. this blog post. Sonuç olarak, Vektör'ün Array'dan daha hızlı olan tek uygulaması sayı türleri için olanlardır (!).

Aslında, bu konuda bazı kapsamlı testler yaptık ve Vector.<int> ints Array daha fazla% 60 daha hızlı iken, Vector.<Object> tüm türevleri hızında sadece eşit olmadığı sonucuna vardık (yaniVector.<Object>, Vector.<String> ile aynı işlemi gerçekleştirir, ayrıca Array'dan yaklaşık% 20 daha yavaş vardır. Bunu iki kez kontrol ettim ve sonuçların oldukça doğru olduğuna inanıyorum.

Sayı tipi vektörlerin daha hızlı olduğu doğrudur, dolayısıyla bunları Array üzerinde performans avantajları için kullanmalısınız. Ama:

gibi sort(), sortOn() kullanacağız veya bunların yerli fonksiyonları çünkü Array elverişli sıralama işlevlerinin herhangi bir başka, yine, aksi karar verebilir ve Sadece eğer SON DÜZENLEME

Bu gerçekten hızlı. Bir Vector üzerinde kendi sıralama yöntemlerinizi uygulamak muhtemelen hızlarına uymayacaktır.

+1

Nasıl bir "Vector" göremiyorum. '," Array "dan daha hızlı olabilir. Bunun neden olduğunu açıklayabilir misiniz? –

6

Ben şahsen herhangi bir performans yararı göremez. Varsa, minimal olacak. Vektör sınıfına sahip olmanın bütün noktası, bir dizinin elemanlarını kesinlikle yazmaktır. Ancak, bir dizi nesnesinin kendisi birden fazla nesne türünü veya hatta yazılmamış biçimini tutmak için tasarlanmıştır. Bu yüzden, bu şekilde düşünülürse, çok fazla yazılmamış veya çok sayıda, çeşitli yazılan içerikle doldurulabilen, esas olarak yazılmamış bir kapsayıcıya bir vektör yazılır. Sadece mantıksal olarak, hiçbir etkisi olmayan çok az şey gibi geliyor.

Güncelleme

İşte benim kanıtlamak için bazı performans testi sonuçları. Biz stres altında koyduğunuzda, dizisinin vektör diziler dizisi olarak performans eşit olduğunu görebilir ve bir test durumda, aslında var da kötüsü:

/ ============================================================================================= 
            Array Tests            
=============================================================================================/
Testing Array of Arrays push performance: 
Total time for 100000 push calls on Array of Arrays: 24 

Testing Array of Arrays random assignment performance: 
Total time for 100000 random assignment calls on Array of Arrays: 40 

Testing Array of Arrays sequential read performance: 
Total time for 100000 sequential read calls on Array of Arrays: 14 

Testing Array of Arrays random read performance: 
Total time for 100000 random read calls on Array of Arrays: 41 
/=============================================================================================/

/============================================================================================= 
            Vector Tests            
=============================================================================================/
Testing Vector of Arrays push performance: 
Total time for 100000 push calls on Vector of Arrays: 24 

Testing Vector of Arrays random assignment performance: 
Total time for 100000 random assignment calls on Vector of Arrays: 49 

Testing Vector of Arrays sequential read performance: 
Total time for 100000 sequential read calls on Vector of Arrays: 14 

Testing Vector of Arrays random read performance: 
Total time for 100000 random read calls on Vector of Arrays: 41 
/=============================================================================================/

Ve Test kodu:

import flash.events.Event; 
import flash.utils.getTimer; 

//Performance timer related 
var startTime:Number; //ms 
// 

//Our two container types we're testing IO on 
var arrayOfArrays:Array = new Array(); 
var vectorOfArrays:Vector.<Array> = new Vector.<Array>(); 
// 

//Used to store a bunch of arrays we're going to use to test 
var testArrays:Array = new Array(); 
// 

var randomIndex:uint = 0; 
var i:uint = 0; 
var arr:Array; 

//Generate a bunch of arrays of mixed typed content 
for(i = 0; i < 100000; ++i) { 
    generateTestArray(); 
} 

/*====================================================================================================== 
***********************************  Array Tests  ********************************************* 
*=====================================================================================================*/ 
//Test push on array of arrays 
trace("Testing Array of Arrays push performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    arrayOfArrays.push(testArrays[i]); 
} 
trace("Total time for 100000 push calls on Array of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 

//Test random write on array of arrays 
trace("Testing Array of Arrays random assignment performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    randomIndex = Math.round(Math.random() * 99999) as uint; 
    arrayOfArrays[randomIndex] = testArrays[randomIndex]; 
} 
trace("Total time for 100000 random assignment calls on Array of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 

//Test sequential read on array of arrays 
trace("Testing Array of Arrays sequential read performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    arr = arrayOfArrays[i]; 
} 
trace("Total time for 100000 sequential read calls on Array of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 

//Test random read on array of arrays 
trace("Testing Array of Arrays sequential read performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    randomIndex = Math.round(Math.random() * 99999) as uint; 
    arr = arrayOfArrays[randomIndex]; 
} 
trace("Total time for 100000 random read calls on Array of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 
/*====================================================================================================*/ 


/*====================================================================================================== 
***********************************  Vector Tests  ********************************************* 
*=====================================================================================================*/ 
//Test push on vector of arrays 
trace("Testing Vector of Arrays push performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    vectorOfArrays.push(testArrays[i]); 
} 
trace("Total time for 100000 push calls on Vector of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 

//Test random write on vector of arrays 
trace("Testing Vector of Arrays random assignment performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    randomIndex = Math.round(Math.random() * 99999) as uint; 
    vectorOfArrays[randomIndex] = testArrays[randomIndex]; 
} 
trace("Total time for 100000 random assignment calls on Vector of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 

//Test sequential read on vector of arrays 
trace("Testing Vector of Arrays sequential read performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    arr = vectorOfArrays[i]; 
} 
trace("Total time for 100000 sequential read calls on Vector of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 

//Test random read on vector of arrays 
trace("Testing Vector of Arrays sequential read performance:"); 
startTime = getTimer(); 
for(i = 0; i < 100000; ++i) { 
    randomIndex = Math.round(Math.random() * 99999) as uint; 
    arr = vectorOfArrays[randomIndex]; 
} 
trace("Total time for 100000 random read calls on Vector of Arrays: " + (getTimer() - startTime)); 
trace(" "); 
// 
/*====================================================================================================*/ 

function generateTestArray():void 
{ 
    var newArray:Array = new Array(); 

    var totalItems:uint = Math.round(Math.random() * 50 + 1); 

    var i:uint = 0; 

    var dice:uint = 0; 

    for(i; i < totalItems; ++i) { 

     dice = Math.round(Math.random() * 5); 

     switch(dice) { 
      case 0: 
       newArray.push(new int(Math.random())); 
      break; 

      case 1: 
       newArray.push(new String(Math.random())); 
      break; 

      case 2: 
       newArray.push(new Array()); 
      break; 

      case 3: 
       newArray.push(new MovieClip()); 
      break; 

      case 4: 
       newArray.push(new Date()); 
      break; 

      case 5: 
       newArray.push(new Event(Event.COMPLETE, false, false)); 
      break; 

     } 
    } 

    testArrays.push(newArray); 
}