2012-04-03 22 views
19

अधिक कुशल क्या है - नोडजेस बफर या टाइप किए गए सरणी? बेहतर प्रदर्शन के लिए मुझे क्या उपयोग करना चाहिए? मुझे लगता है कि केवल वे लोग जो वी 8 और नोडजे के अंदरूनी जानते हैं, इस सवाल का जवाब दे सकते हैं।नोडजेस बफर बनाम टाइप किए गए सरणी

उत्तर

1

यह एक कठिन एक है, लेकिन मुझे लगता है कि यह आप आप कितना डेटा के साथ काम करने की योजना बना रहे उन लोगों के साथ करने की योजना बना रहे हैं और क्या पर निर्भर करेगा?

टाइप किया सरणियों खुद के साथ खेलने के लिए नोड बफ़र्स की जरूरत है, लेकिन कर रहे हैं आसान है और आप 1GB सीमा को दूर कर सकते (kMaxLength = 0x3fffffff)।

यदि आप सामान्य सामान जैसे सेटिंग, सेटिंग, हो रही, स्लाइसिंग इत्यादि कर रहे हैं ... तो टाइप किए गए सरणी प्रदर्शन के लिए आपका सर्वश्रेष्ठ शॉट होना चाहिए, स्मृति नहीं (विशेष रूप से यदि आप फ्लोट और 64 बिट पूर्णांक प्रकार से निपट रहे हैं) ।

अंत में, शायद ही है कि आप क्या करने के लिए इस संदेह पर वास्तविक प्रकाश डाला कर सकते हैं के साथ एक अच्छा बेंचमार्क।

8

एक Node.js buffer एक टाइप सरणी से अधिक कुशल होना चाहिए। इसका कारण यह है कि जब कोई नया नोड.जेएस बफर बनाया जाता है तो उसे सभी 0 के लिए प्रारंभ करने की आवश्यकता नहीं होती है। हालांकि, एचटीएमएल 5 spec का कहना है कि टाइप किए गए सरणी के प्रारंभिकरण में उनके मान 0 पर सेट होना चाहिए। स्मृति को आवंटित करना और फिर सभी मेमोरी को 0 में सेट करना अधिक समय लगता है।

अधिकतर अनुप्रयोगों में से किसी एक को चुनने से कोई फर्क नहीं पड़ता। हमेशा के रूप में, शैतान बेंचमार्क में निहित है :) हालांकि, मैं अनुशंसा करता हूं कि आप एक उठाएं और इसके साथ चिपके रहें। यदि आप अक्सर दोनों के बीच आगे बढ़ रहे हैं, तो आप एक प्रदर्शन हिट लेंगे।

नाइस यहाँ चर्चा: https://github.com/joyent/node/issues/4884

+0

ऐसा लगता है [नोड 8] (https://nodejs.org/dist/latest-v8.x/docs/api/buffer।एचटीएमएल # buffer_new_buffer_size) ने सुरक्षा कारणों से इस "फीचर" को हटा दिया है। – styfle

2

कुछ चीजें मुझे लगता है कि उल्लेख के लायक हैं कर रहे हैं:

  1. Buffer उदाहरणों Uint8Array उदाहरण हैं लेकिन वहाँ ECMAScript 2015 में TypedArray विवरण के लिए के साथ सूक्ष्म असंगतियां हैं उदाहरण के लिए, जबकि ArrayBuffer#slice() टुकड़ा की एक प्रति बनाता है, Buffer#slice() के कार्यान्वयन के बिना मौजूदा बफर पर प्रतिलिपि बनाता है, Buffer#slice() को और अधिक कुशल बनाते हैं।
  2. जब Buffer.allocUnsafe() और Buffer.allocUnsafeSlow() स्मृति का उपयोग नहीं कर ध्यान केंद्रित किया-आउट (के रूप में कई बाहर पहले से ही बताया है) है। तो सुनिश्चित करें कि आप आवंटित स्मृति को पूरी तरह से ओवरराइट करते हैं या जब आप बफर मेमोरी पढ़ते हैं तो पुराने डेटा को लीक करने की अनुमति दे सकते हैं।
  3. TypedArrays तुरंत पढ़ने योग्य नहीं हैं, तो आप उस के लिए एक DataView की आवश्यकता होगी। जिसका अर्थ है कि यदि आप Buffer पर माइग्रेट करना चाहते हैं तो आपको अपने कोड को फिर से लिखना होगा। Adapter pattern यहां मदद कर सकता है।
  4. आप पर Buffer पर उपयोग कर सकते हैं। आप TypedArrays पर नहीं जा सकते। इसके अलावा आपके पास क्लासिक entries(), values(), keys() और length समर्थन नहीं होगा।
  5. Buffer फ्रंटेंड में समर्थित नहीं है जबकि TypedArray अच्छी तरह से हो सकता है। तो यदि आपका कोड फ्रंटेंड या बैकएंड के बीच साझा किया गया है तो आप एक पर चिपकने पर विचार कर सकते हैं।

More info in the docs here

संबंधित मुद्दे