1. التحليل الافتتاحي
يعني المخزن المؤقت المزعوم "منطقة التخزين المؤقتة" ، وهي قطعة من الذاكرة تخزن بيانات الإدخال والإخراج مؤقتًا.
تحتوي لغة JS نفسها فقط على أنواع بيانات السلسلة ولا توجد أنواع بيانات ثنائية. لذلك ، يوفر NodeJS عازلة مُنشأة عالمية من الأقران لتوفير العمليات على البيانات الثنائية. بالإضافة إلى قراءة الملفات للحصول على مثيلات عازلة ، يمكن أيضًا بناؤها مباشرة ، على سبيل المثال:
نسخة الكود كما يلي:
var buffer = new Buffer ([0x68 ، 0x65 ، 0x6C ، 0x6C ، 0x6F]) ؛
المخزن المؤقت يشبه سلسلة. بالإضافة إلى استخدام سمة .Length للحصول على طول البايت ، يمكنك أيضًا استخدام طريقة [الفهرس] لقراءة البايتات في الموضع المحدد ، على سبيل المثال:
نسخة الكود كما يلي:
المخزن المؤقت [0] ؛ // 0x68 ؛
يمكن تحويل المخزن المؤقت والسلسلة إلى بعضهما البعض ، على سبيل المثال ، يمكن تحويل البيانات الثنائية إلى سلاسل باستخدام ترميز محدد:
نسخة الكود كما يلي:
var str = buffer.toString ("utf-8") ؛ // مرحبًا
يحول سلسلة إلى البيانات الثنائية تحت الترميز المحدد:
نسخة الكود كما يلي:
var buffer = new Buffer ("Hello" ، "UTF-8") ؛ // <Buffer 68 65 6C 6C 6F>
اختلاف بسيط:
هناك فرق مهم بين المخزن المؤقت والسلسلة. السلسلة هي للقراءة فقط ، وأي تعديل للسلسلة ينتج عنه سلسلة جديدة ، وتبقى السلسلة الأصلية دون تغيير.
أما بالنسبة للمخزن المؤقت ، فهي أشبه مجموعة من اللغة C التي يمكنها القيام بعمليات المؤشر. على سبيل المثال ، يمكن تعديل البايتات في موضع معين مباشرة في طريقة [الفهرس].
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
لا تُرجع طريقة الشريحة مخزنًا مؤقتًا جديدًا ، ولكنه يعيد مؤشرًا إلى موقع في منتصف المخزن المؤقت الأصلي ، كما هو موضح أدناه.
[0x68 ، 0x65 ، 0x6C ، 0x6C ، 0x6F]
^ ^
| |
بن بن.
لذلك ، فإن تعديل المخزن المؤقت الذي تم إرجاعه بواسطة طريقة الشريحة سيعمل على المخزن المؤقت الأصلي ، على سبيل المثال:
نسخة الكود كما يلي:
var buffer = new Buffer ([0x68 ، 0x65 ، 0x6C ، 0x6C ، 0x6F]) ؛
var sub = bin.slice (2) ؛
sub [0] = 0x65 ؛
console.log (المخزن المؤقت) ؛ // <Buffer 68 65 65 6c 6f>
إذا كنت ترغب في نسخ المخزن المؤقت ، فيجب عليك أولاً إنشاء مخزن مؤقت جديد ونسخ البيانات في المخزن المؤقت الأصلي من خلال طريقة .Copy.
هذا يشبه التقدم بطلب للحصول على جزء جديد من الذاكرة ونسخ البيانات في الذاكرة الحالية. هنا مثال.
نسخة الكود كما يلي:
var buffer = new Buffer ([0x68 ، 0x65 ، 0x6C ، 0x6C ، 0x6F]) ؛
var dup = New Buffer (bin.length) ؛
buffer.copy (DUP) ؛
DUP [0] = 0x48 ؛
console.log (المخزن المؤقت) ؛ // <Buffer 68 65 6C 6C 6F>
console.log (DUP) ؛ // <Buffer 48 65 65 6c 6f>
باختصار ، يوسع المخزن المؤقت قدرات معالجة بيانات JS من الأوتار إلى البيانات الثنائية التعسفية.
ما سبق يتيح لك لفترة وجيزة فهم ماهية المخزن المؤقت. دعنا نتحدث عن كيفية استخدامه وسيناريوهات الاستخدام المحددة أدناه.
ثانياً ، تحدث عن المخزن المؤقت
JavaScript ودية للغاية لمعالجة السلسلة ، وما إذا كانت بايت عريض أو سلسلة بايت واحدة ، فهي تعتبر سلسلة. تحتاج العقدة إلى معالجة بروتوكولات الشبكة ، وقواعد بيانات التشغيل ، ومعالجة الصور ، وتحميل الملفات ، وما إلى ذلك ، كما تحتاج إلى معالجة كمية كبيرة من البيانات الثنائية. الأوتار التي تأتي معهم بعيدة عن تلبية هذه المتطلبات ، لذلك ظهرت المخزن المؤقت.
بنية العازلة
المخزن المؤقت هو وحدة نموذجية تجمع بين JavaScript و C ++. يتم تنفيذ الجزء المتعلق بالأداء في C ++ ، ويتم تنفيذ الجزء غير المتعلق بالأداء في JavaScript.
يتم تثبيت العقدة في الذاكرة عندما تبدأ العملية وتضعها في الكائن العالمي ، لذلك ليست هناك حاجة إلى طلب ذلك.
كائن عازلة: على غرار صفيف ، فإن عناصرها عبارة عن أرقام مزدوجة في سداسي عشري.
تخصيص الذاكرة العازلة
إن تخصيص الذاكرة للكائن العازلة ليس في ذاكرة الكومة لـ V8 ، ولكنه ينفذ تطبيق الذاكرة على مستوى C ++ للعقدة.
من أجل استخدام تطبيق الذاكرة بكفاءة ، تستخدم Node آلية تخصيص الألواح ، وهي آلية ديناميكية لإدارة الذاكرة التي تطبق أنظمة التشغيل *NIX المختلفة. هناك ثلاث حالات من البلاطة:
(1) ممتلئة: حالة مخصصة بالكامل
(2) جزئي: حالة التخصيص الجزئي
(3) فارغة: لم يتم تعيين حالة
تحويل المخزن المؤقت
يمكن تحويل الكائنات العازلة إلى سلاسل ، وأنواع الترميز المدعومة هي كما يلي:
ASCII ، UTF-8 ، UTF-16LE/UCS-2 ، BASE64 ، BINARY ، HEX
سلسلة إلى المخزن المؤقت
New Buffer (Str ، [الترميز]) ، افتراضي UTF-8
buf.write (سلسلة ، [إزاحة] ، [طول] ، [تشفير])
العازلة إلى سلسلة
buf.ToString ([الترميز] ، [ابدأ] ، [نهاية])
أنواع الترميز التي لا تدعمها المخزن المؤقت
حدد ما إذا كان يدعمه بواسطة buffer.isencoding (الترميز)
ICONV-Lite: تنفيذ JavaScript النقي ، أخف وزنا ، أداء أفضل بدون C ++ لتحويل JavaScript
ICONV: استدعاء مكتبة Libiconv في C ++ يكمل
الربط العازلة
لاحظ "res.on ('data' ، function (chunk) {})" ، حيث يكون جزء المعلمة كائن مخزن مؤقت. مباشرة باستخدام + خياطة سيتم تحويلها تلقائيًا إلى سلسلة. بالنسبة لأحرف البايت الواسعة ، قد تحدث رمز مشجعة.
حل:
(1) من خلال طريقة setenCoding () في الدفق القابل للقراءة ، تتيح هذه الطريقة لحدث البيانات تمرير كائن مخزن مؤقت ، ولكن يتم استخدام سلسلة مشفرة ، ويتم استخدام وحدة StringEncoder داخليًا.
(2) تخزين الكائن العازلة في صفيف ، وأخيراً تجميعه في مخزن مؤقت كبير ثم ترميزه في إخراج السلسلة.
يستخدم المخزن المؤقت على نطاق واسع في ملف I/O و Network I/O ، وأدائه له أهمية كبيرة وأعلى بكثير من الأوتار العادية.
بالإضافة إلى فقدان أداء تحويل السلسلة ، عند استخدام المخزن المؤقت ، يعد إعداد Highwatermark أمرًا ضروريًا لتأثير الأداء عند قراءة ملف.
أ. إن إعدادات Highwatermark لها تأثير معين على تخصيص واستخدام الذاكرة العازلة.
ب. إعداد Highwatermark صغير جدًا ، مما قد يؤدي إلى العديد من مكالمات النظام.
متى يجب أن أستخدم المخزن المؤقت ، متى يجب ألا أستخدمه ------- يدعم JavaScript النقية رمز Unicode ولكن لا يدعم ثنائيًا. عند حل تدفقات TCP أو تدفقات الملفات ، من الضروري معالجة التدفقات. عندما نقوم بحفظ الأوتار غير UTF-8 ، تنسيقات ثنائية وغيرها من التنسيقات ، يجب أن نستخدم "المخزن المؤقت".
3. إدخال أمثلة
نسخة الكود كما يلي:
var buf = new Buffer ("هذا هو اختبار concat text!") ، str = "هذا هو اختبار concat text!" ؛
Console.Time ("اختبار CONCAT BUFFER!") ؛
var list = [] ؛
var len = 100000 * buf.length ؛
لـ (var i = 0 ؛ i <100000 ؛ i ++) {
list.push (buf) ؛
len += buf.length ؛
}
var s1 = buffer.concat (list ، len) .toString () ؛
Console.TimeEnd ("اختبار COSTER BUTIOR!") ؛
Console.Time ("اختبار سلسلة CONCAT!") ؛
var list = [] ؛
لـ (var i = 100000 ؛ i> = 0 ؛ i--) {
list.push (str) ؛
}
var s2 = list.join ("") ؛
Console.TimeEnd ("اختبار سلسلة CONCAT!") ؛
فيما يلي نتائج التشغيل:
سرعة القراءة هي بالتأكيد أسرع ، ويتطلب المخزن المؤقت أيضًا تشغيل ToString (). لذلك عندما نقوم بحفظ السلاسل ، ما زلنا بحاجة إلى استخدام السلسلة. حتى لو قمنا بتوصيل الأوتار في سلاسل كبيرة ، فإن سرعة السلاسل لن تكون أبطأ من المخازن المؤقتة.
إذن متى نحتاج إلى استخدام المخازن المؤقتة مرة أخرى؟ عندما لا تكون هناك طريقة ، عندما نقوم بإنقاذ الأوتار غير UTF-8 ، تنسيقات ثنائية وغيرها ، يجب أن نستخدمها.
أربعة ، دعونا نلخص
(1) JavaScript مناسبة لمعالجة البيانات المشفرة Unicode ، ولكنها ليست ودية لمعالجة البيانات الثنائية.
(2) ، لذلك عند معالجة تدفقات TCP أو أنظمة الملفات ، من الضروري معالجة تدفقات الثماني.
(3) ، تحتوي العقدة على عدة طرق للمعالجة وإنشاء واستهلاك تدفقات الثماني.
(4) يتم تخزين البيانات الخام في مثيل عازلة. يشبه المخزن المؤقت صفيف عدد صحيح ، ولكن يتم تخصيص ذاكرته خارج مكدس V8. لا يمكن تغيير حجم المخزن المؤقت.
(5) ، أنواع الترميز التي تمت معالجتها هي: ASCII ، UTF8 ، UTF16LE ، UCS2 (الاسم المستعار لـ UTF16LE) ، BASE64 ، ثنائي ، HX.
(6) المخزن المؤقت هو عنصر عالمي ، ويتم الحصول على مثيل عازلة بواسطة Buffer () الجديد مباشرة.