أثناء عملية تطوير البرنامج النصي، غالبًا ما يتم دمج سلسلة كبيرة وربطها للإخراج وفقًا لقاعدة معينة. على سبيل المثال، عند كتابة عنصر تحكم البرنامج النصي، يتم إخراج علامة HTML التي تتحكم في مظهر عنصر التحكم بالكامل، أو عند التحليل الديناميكي وإنشاء علامات HTML بعد الحصول على قيمة الإرجاع من جانب الخادم في AJAX، لكنني لن أناقش التطبيق المحدد لـ ربط السلاسل هنا أريد فقط أن نناقش كفاءة الربط هنا.
عندما نكتب ربط السلسلة، نستخدم دائمًا عامل التشغيل "+="، s += String؛ هذه هي طريقة الكتابة الأكثر شيوعًا، لا أعرف ما إذا كنت قد لاحظت أن سعة السلسلة المدمجة تكون عندما يكون الرقم عشرات أو حتى مئات K، تنفيذ البرنامج النصي بطيء جدًا واستخدام وحدة المعالجة المركزية مرتفع للغاية، على سبيل المثال:
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789n";
نتيجة فار = "";
for(var i=0; i<2000; i++) result += str;
في خطوة واحدة فقط، تكون السلسلة الناتجة 200 كيلو، وتستغرق 1.1 ثانية (يرتبط هذا بتكوين الكمبيوتر)، وتكون القيمة القصوى لوحدة المعالجة المركزية 100. %. (من أجل رؤية التأثير بشكل أكثر سهولة، قمت بعمل المزيد من الحلقات). من المتصور أن مثل هذه الخطوة من العملية تستهلك أكثر من ثانية من وقتي، إلى جانب استهلاك الوقت للرموز الأخرى، يصبح وقت تنفيذ كتلة البرنامج النصي بأكمله لا يطاق. هل هناك أي حل الأمثل؟ هل هناك أي طريقة أخرى؟ الجواب بالطبع نعم، وإلا سيكون من الهراء أن أكتب هذا المقال.
الطريقة الأسرع هي استخدام مصفوفة. عند الربط في حلقة، بدلاً من ربطها في سلسلة، يتم وضع السلسلة في مصفوفة، وأخيراً يتم استخدام array.join("") للحصول على مثال التعليمات البرمجية الناتج :
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789n";
نتيجة فار = ""، a = new Array();
for(var i=0; i<2000; i++) a[i] = str;
result = a.join(""); a = null;
يمكنك اختبار الوقت المستغرق لدمج سلسلة من نفس الحجم. والنتيجة التي اختبرتها هنا هي: <15 مللي ثانية. مما يعني أنه لتجميع مثل هذه السلسلة التي يبلغ طولها 200 كيلو بايت، فإن استهلاك الوقت للوضعين يبلغ تقريبًا أمرين من حيث الحجم. ماذا يعني ذلك؟ وهذا يعني أن الأخير قد أنهى عمله وعاد من الغداء، بينما لا يزال الأول يقوم بعمل شاق. لقد كتبت صفحة اختبار، يمكنك نسخ الكود التالي وحفظه كملف HTM وفتحه على صفحة الويب لاختبار فرق الكفاءة بين الاثنين. على أية حال، ما اختبرته هو أن الأول يستغرق نصف دقيقة حتى يكتمل والأخير أو يمكن إجراؤه في 0.07 ثانية (حلقة 10000 مرة).
<الجسم>
عدد سلاسل السلسلة<input id="totle" value="1000" size="5" maxlength="5">
<input type = "button" value = "طريقة ربط السلسلة" عند النقر = "method1 ()">
<input type="button" value="طريقة ربط تعيين الصفيف" onclick="method2()"><br>
<div id="method1"> </div>
<div id="method2"> </div>
<textarea id="show" style="width: 100%; الارتفاع: 400"></textarea>
<لغة البرنامج النصي = "جافا سكريبت">
<!--
// طول هذه السلسلة المقسمة هو 100 بايت المؤلف: meizz
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789n";
// الطريقة الأولى
طريقة الوظيفة1()
{
نتيجة فار = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime();
for(var i=0; i<totle; i++)
{
النتيجة += شارع؛
}
document.getElementById("show").value = result;
var s = "طريقة ربط السلسلة: طول السلسلة الكبيرة بعد الربط"+result.length +"بايت"،+
"يستغرق الربط وقتًا" + (new Date().getTime()-n) + "ميلي ثانية!";
document.getElementById("method1").innerHTML = s;
}
// الطريقة الثانية
طريقة الوظيفة 2 ()
{
نتيجة فار = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime();
var a = new Array();
ل(فار ط = 0؛ أنا<totle؛ i++)
{
a[i] = str;
}
result = a.join(""); a=null
document.getElementById("show").value = result;
var s = "طريقة ضم تعيين المصفوفة: طول السلسلة الكبيرة بعد الربط"+result.length +"bytes,"+
"يستغرق الربط وقتًا" + (new Date().getTime()-n) + "ميلي ثانية!";
document.getElementById("method2").innerHTML = s;
}
//-->
</SCRIPT>
أخيرًا، اسمحوا لي أن أقول بضع كلمات، هل سيتم استخدام ربط المصفوفة لربط السلسلة في المستقبل؟ يعتمد هذا على احتياجاتك الفعلية بالنسبة للمجموعات العادية المكونة من عدد قليل من البايتات أو على مستوى K، ليست هناك حاجة لاستخدام طريقة المصفوفة، لأن فتح متغيرات المصفوفة مكلف أيضًا. إذا كان هناك أكثر من عدد قليل من مجموعات سلسلة K، تكون كفاءة المصفوفة عالية.
-------------------------------------------------- ----------
آي إي 6.0:
طريقة ربط السلسلة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 22,089 مللي ثانية!
طريقة ربط تعيين المصفوفة: يبلغ طول السلسلة الكبيرة المقسمة 1،010،000 بايت، ويستغرق الربط 218 مللي ثانية!
فايرفوكس 1.0:
طريقة ربط السلسلة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 1,044 مللي ثانية!
طريقة ربط تعيين المصفوفة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 1,044 مللي ثانية!
موزيلا 1.7:
طريقة ربط السلسلة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 1,045 مللي ثانية!
طريقة ربط تعيين المصفوفة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 1,044 مللي ثانية!
نتسكيب 7.0:
طريقة ربط السلسلة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 10,273 مللي ثانية!
طريقة ربط تعيين المصفوفة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 1,138 مللي ثانية!
أوبرا 7.54:
طريقة ربط السلسلة: يبلغ طول السلسلة الكبيرة المقسمة 1,010,000 بايت، ويستغرق الربط 6,968 مللي ثانية!
طريقة ربط تعيين المصفوفة: يبلغ طول السلسلة الكبيرة المقسمة 1010000 بايت، ويستغرق الربط 6922 مللي ثانية!
تظهر نتائج اختبار التكرار 10000 مرة أنه يمكن تحسين الكفاءة بشكل كبير في IE وNetscape، في حين أن استهلاك الوقت للطريقتين في Firefox Mozilla Opera متشابه بشكل أساسي. هذه البيانات كافية لتحديد أن طريقة ربط المصفوفة أفضل من ربط السلسلة التقليدية.