आधुनिक इंजन पर्दे के पीछे सच सरणियों का उपयोग भले ही आप Array
का उपयोग करता है, तो उन्हें लगता है कि वे कर सकते हैं, संपत्ति नक्शा "सरणियों" पर वापस गिरने अगर आप कुछ उन्हें लगता है कि वे एक सच्चे सरणी उपयोग नहीं कर सकते है कि क्या करेंगे।
भी ध्यान रखें कि radsoc points out के रूप में, var buffer = new ArrayBuffer(0x10000)
तो var Uint32 = new Uint32Array(buffer)
एक uint32 सरणी जिसका आकार 0x4000 (0x10000/4), नहीं 0x10000 है, पैदा करता है क्योंकि मूल्य आप ArrayBuffer
देना बाइट्स में है, लेकिन निश्चित रूप से Uint32Array प्रविष्टि प्रति चार बाइट्स देखते हैं । सेब के साथ सेब की तुलना करने के लिए नीचे दिए गए सभी new Uint32Array(0x10000)
(और हमेशा इस संपादन से पहले भी) का उपयोग करते हैं।
तो new Uint32Array(0x10000)
साथ, आइए वहीं से शुरू: http://jsperf.com/array-access-speed-2/11(दुर्भाग्य से, JSPerf इस परीक्षण और उसके परिणामों को खो दिया है, और ऑफलाइन पूरी तरह से अब है)
पता चलता है कि ऐसा इसलिए है क्योंकि आप ' सरणी को एक साधारण, अनुमानित तरीके से भरने के बाद, एक आधुनिक इंजन आगे बढ़ने के बजाए कवर के तहत एक वास्तविक सरणी (उसके प्रदर्शन लाभ के साथ) का उपयोग जारी रखता है। हम मूल रूप से दोनों के लिए एक ही प्रदर्शन देखते हैं। गति में अंतर Uint32
मान लेने वाले रूपांतरण प्रकार से संबंधित हो सकता है और इसे sum
पर number
के रूप में असाइन कर सकता है (हालांकि मुझे आश्चर्य है कि उस प्रकार का रूपांतरण स्थगित नहीं हुआ है ...)।
, कुछ अराजकता जोड़े हालांकि: ", सरणियों" ...
var Uint32 = new Uint32Array(0x10000);
var arr = [];
for (var i = 0x10000 - 1; i >= 0; --i) {
Uint32[Math.random() * 0x10000 | 0] = (Math.random() * 0x100000000) | 0;
arr[Math.random() * 0x10000 | 0] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
ताकि इंजन पुराने जमाने संपत्ति के नक्शे पर पीछे हटना है और आप देखते हैं कि टाइप सरणियों स्पष्ट रूप से मात पुराने ढंग का तरह: http://jsperf.com/array-access-speed-2/3(दुर्भाग्य से, JSPerf खो दिया है इस परीक्षण और उसके परिणाम)
चालाक, इन JavaSc रिप्ट इंजन इंजीनियरों ...
Array
सरणी की गैर-सरणी प्रकृति के साथ आप जो विशिष्ट चीज करते हैं, हालांकि; पर विचार करें:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
arr.foo = "bar"; // <== Non-element property
for (var i = 0; i < 0x10000; ++i) {
Uint32[i] = (Math.random() * 0x100000000) | 0;
arr[i] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
कि अभी भी सरणी जाहिर भरने है, लेकिन हम यह करने के लिए एक गैर-तत्व संपत्ति (foo
) जोड़ें। http://jsperf.com/array-access-speed-2/4(दुर्भाग्य से, JSPerf इस परीक्षण और उसके परिणामों को खो दिया है) जाहिर है, इंजन काफी चतुर हैं, और जब तत्व संपत्तियों के लिए एक सच्चे सरणी का उपयोग जारी रखने तरफ है कि गैर तत्व संपत्ति रखें:
मैं एक नुकसान की व्याख्या करने का एक सा पर हूँ क्यों मानक सरणियों मिलना चाहिए तेजी वहाँ ऊपर हमारा पहला परीक्षण की तुलना में। माप त्रुटि? Math.random
में वैगरीज? लेकिन हम अभी भी बहुत यकीन कर रहे हैं कि Array
में सरणी-विशिष्ट डेटा अभी भी एक वास्तविक सरणी है।
जबकि यदि हम एक ही काम करते हैं लेकिन उलटे क्रम में भरने:
var Uint32 = new Uint32Array(0x10000);
var arr = [];
arr.foo = "bar"; // <== Non-element property
for (var i = 0x10000 - 1; i >= 0; --i) { // <== Reverse order
Uint32[i] = (Math.random() * 0x100000000) | 0;
arr[i] = (Math.random() * 0x100000000) | 0;
}
var sum = 0;
... हम वापस टाइप किया सरणियों को IE11 पर छोड़कर — बाहर जीतने मिलती है: http://jsperf.com/array-access-speed-2/9(दुर्भाग्य से, JSPerf है इस परीक्षण और उसके परिणाम)
क्या आपने jsperf परीक्षण हटा दिए थे? मैं उन्हें और अधिक नहीं देख सकता – Bergi
नहीं, मैंने इसे हटा नहीं दिया है। यह अजीब है। –
बहुत, बहुत अजीब है कि वे इस तरह गायब हो गए होंगे! उनमें से सभी ... [इस एफएक्यू एंट्री] के प्रकाश में विशेष रूप से अजीब] (http://jsperf.com/faq#test- उपलब्धता)। मैंने यूआरएल को बदल दिया या कुछ, और ... कुछ भी नहीं खोजा है। मैं सरणी प्रदर्शन के अन्य परीक्षण पा सकता हूं, लेकिन सुखानोव और मेरा नहीं। मैंने एक [इसके लिए मुद्दा] उठाया है (https://github.com/mathiasbynens/jsperf.com/issues/197)। बेशक, अगर हम में से अधिक [jsPerf को दान किया गया है] (http://jsperf.com/faq#donate) (और मैंने अभी किया ... पहली बार * बतख सिर *) के लिए शायद यह चोट नहीं पहुंचाएगा। –