التدريب الداخلي للسلسلة
في علوم الحاسوب، يُعدّ تخزين السلاسل النصية طريقةً لحفظ نسخة واحدة فقط من كل قيمة نصية مميزة ، ويجب أن تكون هذه النسخة غير قابلة للتغيير . [ 1 ] يُحسّن تخزين السلاسل النصية كفاءة بعض مهام معالجة السلاسل النصية من حيث الوقت أو المساحة، على حساب زيادة الوقت اللازم لإنشاء السلسلة أو تخزينها. تُخزّن القيم المميزة في مجمع تخزين السلاسل النصية .
تُسمى النسخة الوحيدة من كل سلسلة نصية " النسخة الداخلية" ويتم البحث عنها عادةً بواسطة دالة من فئة السلسلة النصية، على سبيل المثال String.intern() [ 2 ] في جافا . يتم تخزين جميع السلاسل النصية الثابتة في وقت الترجمة في جافا تلقائيًا باستخدام هذه الدالة. [ 3 ]
يدعم تخزين السلاسل النصية في بعض لغات البرمجة الحديثة الموجهة للكائنات ، بما في ذلك جافا، وبايثون ، وبي إتش بي (منذ الإصدار 5.4)، ولوا [ 4 ] ، ولغات .NET . [ 5 ] وتُعدّ لغات مثل ليسب ، وسكيم ، وجوليا ، وروبي ، وسمول توك من بين اللغات التي تحتوي على نوع رمزي يُخزّن السلاسل النصية. كما تحتوي مكتبة Standard ML of New Jersey على نوع يُؤدي الوظيفة نفسها. وتُعدّ مُحدِّدات Objective-C ، التي تُستخدم بشكل أساسي كأسماء للدوال، سلاسل نصية مُخزَّنة.atom
يمكن تخزين الكائنات الأخرى غير السلاسل النصية. على سبيل المثال، في لغة جافا، عند تغليف القيم الأولية في كائن غلاف ، يتم تخزين قيم معينة (أي قيمة boolean، أي قيمة byte، أي قيمة charمن 0 إلى 127، وأي shortقيمة intبين -128 و127)، ويضمن أن أي تحويلين للتغليف لإحدى هذه القيم سينتج عنهما نفس الكائن. [ 6 ]
تاريخ
أدخلت لغة ليسب مفهوم السلاسل المخزنة لرموزها . تاريخياً، كانت بنية البيانات المستخدمة كمجمع تخزين للسلاسل تسمى oblist (عندما تم تنفيذها كقائمة مرتبطة ) أو obarray (عندما تم تنفيذها كمصفوفة).
تُميّز لهجات لغة ليسب الحديثة عادةً بين الرموز والسلاسل النصية؛ إذ يُعيد تخزين سلسلة نصية مُعينة رمزًا موجودًا أو يُنشئ رمزًا جديدًا يحمل اسم تلك السلسلة. غالبًا ما تمتلك الرموز خصائص إضافية لا تمتلكها السلاسل النصية، مثل تخزين القيم المرتبطة بها أو تحديد نطاقات الأسماء. يُفيد هذا التمييز أيضًا في منع المقارنة العرضية بين سلسلة نصية مُخزّنة وسلسلة نصية أخرى لم تُخزّن بالضرورة، الأمر الذي قد يؤدي إلى أعطال متقطعة تبعًا لأنماط الاستخدام.
تحفيز
يُسرّع تخزين السلاسل النصية في الذاكرة من عمليات مقارنة السلاسل، والتي تُعدّ أحيانًا عائقًا أمام الأداء في التطبيقات (مثل المترجمات وبيئات تشغيل لغات البرمجة الديناميكية ) التي تعتمد بشكل كبير على المصفوفات الترابطية ذات المفاتيح النصية للبحث عن سمات وأساليب كائن ما. بدون التخزين، قد تتطلب مقارنة سلسلتين نصيتين مختلفتين فحص كل حرف في كلتيهما. وهذا بطيء لعدة أسباب: فهو بطبيعته من رتبة O(n) بالنسبة لطول السلاسل؛ ويتطلب عادةً قراءة من عدة مناطق في الذاكرة ، وهو ما يستغرق وقتًا؛ كما أن عمليات القراءة هذه تملأ ذاكرة التخزين المؤقت للمعالج، مما يعني وجود مساحة أقل متاحة للاحتياجات الأخرى. مع السلاسل المخزنة، يكفي إجراء اختبار بسيط لهوية الكائن بعد عملية التخزين الأصلية؛ ويتم تنفيذ هذا عادةً كاختبار مساواة مؤشر، وهو في الغالب مجرد تعليمة واحدة للآلة بدون أي مرجع للذاكرة على الإطلاق.
يُقلل تخزين السلاسل النصية من استهلاك الذاكرة في حال وجود نسخ متعددة من نفس قيمة السلسلة النصية؛ على سبيل المثال، عند قراءتها من الشبكة أو من وحدة التخزين . قد تتضمن هذه السلاسل أرقامًا سحرية أو معلومات بروتوكول الشبكة . على سبيل المثال، قد تُخزن مُحللات XML أسماء الوسوم والخصائص لتوفير الذاكرة. يُمكن لنقل الكائنات عبر الشبكة باستخدام تدفقات كائنات تسلسل Java RMI نقل السلاسل النصية المخزنة بكفاءة أكبر، حيث يُستخدم مُعرّف كائن السلسلة النصية بدلاً من الكائنات المُكررة عند التسلسل. [ 7 ]
مشاكل
تعدد الخيوط
إذا كانت السلاسل المخزنة قابلة للتغيير، فإن أحد عيوب تخزين السلاسل قد يكون إشكاليًا عند دمجه مع تعدد الخيوط . في العديد من الأنظمة، يُشترط أن تكون السلاسل المخزنة عامة لجميع الخيوط ضمن مساحة عنوان (أو عبر أي سياقات قد تتشارك المؤشرات)، وبالتالي فإن مجمعات التخزين المؤقت هي موارد عامة يجب مزامنتها لضمان الوصول المتزامن الآمن. مع أن هذا يؤثر فقط على إنشاء السلاسل (حيث يجب فحص مجمع التخزين المؤقت وتعديله عند الضرورة)، ويمكن استخدام آلية القفل المزدوج على المنصات التي يُعد فيها هذا تحسينًا آمنًا، إلا أن الحاجة إلى الاستبعاد المتبادل عند تعديل مجمع التخزين المؤقت قد تكون مكلفة. [ 8 ]
ويمكن أيضًا تقليل التنازع عن طريق تقسيم مساحة السلسلة إلى مجموعات متعددة، والتي يمكن مزامنتها بشكل مستقل عن بعضها البعض.
استعادة السلاسل الداخلية غير المستخدمة
لا تحاول العديد من تطبيقات السلاسل المخزنة استعادة السلاسل غير المستخدمة (يدويًا أو غير ذلك). بالنسبة للتطبيقات التي يكون فيها عدد السلاسل المخزنة صغيرًا أو ثابتًا، أو التي لا تدوم طويلًا، قد يكون فقدان موارد النظام مقبولًا. ولكن بالنسبة للأنظمة طويلة الأمد التي يتم فيها إنشاء أعداد كبيرة من السلاسل المخزنة أثناء التشغيل، قد تنشأ الحاجة إلى استعادة السلاسل غير المستخدمة. يمكن لجامع البيانات المهملة معالجة هذه المهمة ، ولكن لكي يعمل هذا بشكل صحيح، يجب تخزين المراجع الضعيفة للسلاسل المخزنة في مجمع السلاسل المخزنة.
انظر أيضاً
مراجع
- ↑ "String.Intern Method (String)" . شبكة مطوري مايكروسوفت . تم الاطلاع عليه بتاريخ 25 مارس 2017 .
- ↑
String.intern() - ↑ "الفصل 15. التعبيرات" . docs.oracle.com . تم الاطلاع عليه بتاريخ 30 يناير 2019 .
- ↑ "ويكي مستخدمي لغة لوا: الكائنات غير القابلة للتغيير" . lua-users.org . تم الاطلاع عليه بتاريخ 30 يناير 2019 .
- ↑ rpetrusha. "فئة السلسلة (النظام)" . docs.microsoft.com . تم الاطلاع عليه بتاريخ 30 يناير 2019 .
- ↑ "الفصل 5. التحويلات والترقيات" . docs.oracle.com . تم الاطلاع عليه بتاريخ 30 يناير 2019 .
- ↑ "مواصفات تسلسل كائنات جافا: 1 - بنية النظام" . docs.oracle.com . تم الاطلاع عليه بتاريخ 30 يناير 2019 .
- ↑ "String.intern في Java 6 و7 و8 - الوصول متعدد الخيوط" . java-performance.info . 3 سبتمبر 2013. تم الاطلاع عليه في 30 يناير 2019 .
روابط خارجية
- تحسين البرمجيات
- السلاسل النصية (علوم الحاسوب)
