2011-12-18 5 views
6

क्या वेक्टर के प्रकार के वेक्टर में Arrays संग्रहीत करने में कोई प्रदर्शन लाभ है?एआर 3 वेक्टर के एरेक्टर

उदाहरण के विकल्प 1

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

विकल्प 2

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

इसके अलावा, मैं एक वेक्टर या वाहक हो सकती है?

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

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

धन्यवाद,

मार्क

+0

मेरा अद्यतन उत्तर @ crooksy88 देखें। मैंने टेस्ट कोड + परिणाम पोस्ट किए हैं जो दिखाता है कि मेरा मूल सही है और weltraumpirat का जवाब पेटेंट झूठा है। –

उत्तर

10

संपादित

मेरे मूल जवाब बहुत अंतिम भाग के लिए छोड़कर गलत था, और मुझे लगता है कि के लिए माफी माँगता किया है। मैं इस तथ्य के बारे में जानता था कि वेक्टर के पास "हुड के नीचे" चार कार्यान्वयन हैं। (आप रॉबर्ट पेननर here द्वारा एक पोस्ट में एफपी 10 playerglobal.swc से अपूर्ण स्रोतों को पा सकते हैं) उनमें से तीन संख्या प्रकार (int, uint और संख्या) के लिए हैं। एक वस्तु प्रकार के लिए है। यह आखिरी व्यक्ति पकड़-सब के रूप में कार्य करता है और ऑब्जेक्ट से प्राप्त सभी वर्गों में ले जाता है। यही कारण है कि मैंने माना कि Vector.<Object> एरे से अभी भी तेज था, the information regarding vectors and arrays available from Adobe पर निर्भर था।

हालांकि, ऐसा लगता है यह जानकारी गलत है, या कम से कम यह कुछ महत्वपूर्ण भागों बाहर छोड़ देता है कि:

  1. Vector.<AnyClassDerivedFromObject> सख्त टाइपिंग के लिए अनुमति देता है, इस प्रकार की जानकारी केवल संकलन समय में मूल्यांकन किया जाता है (ताकि आप अधिक प्रकार की सुरक्षा प्राप्त करें), लेकिन रनटाइम पर नहीं - इस प्रकार अनिवार्य रूप से सख्त टाइपिंग ऑब्जेक्ट वेक्टर के लाभ प्रदर्शन पर लागू नहीं होते हैं। अधिक जानकारी के लिए this blog post देखें।

  2. नतीजतन, वेक्टर की एकमात्र कार्यान्वयन जो ऐरे से तेज़ हैं, संख्या प्रकार (!) के लिए हैं।

वास्तव में, मैं इस पर कुछ व्यापक परीक्षण किया है, और इस निष्कर्ष पर आ गए हैं कि जब तक Vector.<int> अप करने के लिए 60% ints की सरणी की तुलना में तेजी है, सभी Vector.<Object> की derivates गति में ही बराबर नहीं हैं (अर्थातVector.<Object>Vector.<String> जैसा ही करता है, वे लगभग 20% धीमे ऐरे की तुलना में धीमे हैं। मैंने डबल- और ट्रिपल-चेक किया है, इसलिए मेरा मानना ​​है कि परिणाम काफी सटीक हैं।

यह अभी भी सच है कि संख्या प्रकार वैक्टर तेजी से हैं, इसलिए आपको उन लोगों को ऐरे पर प्रदर्शन लाभ के लिए उपयोग करना चाहिए। लेकिन:

अंत संपादित

आप sort(), sortOn() का उपयोग करने जा रहे हैं सिर्फ अगर या सरणी के सुविधाजनक छंटाई कार्यों के किसी भी अन्य, आप अभी भी, नहीं तो तय कर सकते हैं, क्योंकि इन देशी कार्य हैं, और जैसा कि ऐसे वास्तव में तेजी से। एक वेक्टर पर अपनी खुद की सॉर्टिंग विधियों को लागू करना शायद उनकी गति से मेल नहीं खाएगा।

+1

मैं यह देखने में असफल रहा कि कैसे एक वेक्टर। '' ऐरे 'से कहीं अधिक तेज हो सकता है। क्या आप विस्तार कर सकते हैं कि यह क्यों है? –

6

मैं व्यक्तिगत रूप से किसी भी प्रदर्शन लाभ नहीं देख सकता। यदि कोई है, तो यह न्यूनतम होगा। वेक्टर वर्ग रखने का पूरा बिंदु सख्ती से सरणी के तत्वों को टाइप करना है। लेकिन, एक सरणी ऑब्जेक्ट को स्वयं को कई प्रकार की ऑब्जेक्ट्स या यहां तक ​​कि बिना चिपकने के लिए डिज़ाइन किया गया है ... इसलिए एक अनिवार्य रूप से अवांछित कंटेनर को सदिश टाइप करना जो कि बिना टाइप किए गए या एकाधिक, विभिन्न टाइप की गई सामग्री से भरा जा सकता है ... इस तरह से सोचा गया यह सिर्फ तार्किक रूप से लगता है जैसे इसका कोई प्रभाव नहीं होगा।

अद्यतन

यहाँ मेरी बात साबित करने के कुछ प्रदर्शन परीक्षण के परिणाम है। हम देख सकते हैं कि जब तनाव में डाल दिया, सरणियों के वेक्टर सरणियों की एक सरणी के रूप में प्रदर्शन के बराबर है, और एक परीक्षण के मामले में, यह वास्तव में है भी बदतर:

/ ============================================================================================= 
            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 
/=============================================================================================/

और परीक्षण कोड:

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); 
} 
संबंधित मुद्दे