أثناء تطوير البرنامج النصي ، غالبًا ما يتم دمج سلسلة كبيرة وتراجع في سلسلة كبيرة للإخراج وفقًا لقاعدة معينة. على سبيل المثال ، عند كتابة عناصر تحكم البرنامج النصي ، فإن إخراج علامات HTML التي تتحكم في ظهور عنصر التحكم بأكمله. على سبيل المثال ، عند تحليل علامات HTML ديناميكيًا بعد الحصول على قيمة الخلفية من جانب الخادم في AJAX ، لن أناقش التطبيق المحدد لسلاسل الربط هنا. أريد فقط مناقشة كفاءة الربط هنا.
عندما نكتب رمزًا ، نستخدم " +=" المشغل ، S += String ؛ هذه هي الطريقة الأكثر دراية للكتابة. أتساءل عما إذا كنت قد لاحظت ذلك. عندما تكون سعة السلسلة المدمجة هي عشرات K أو حتى مئات K ، يكون البرنامج النصي بطيئًا جدًا في التنفيذ ومعدل استخدام وحدة المعالجة المركزية مرتفع جدًا ، على سبيل المثال:
نسخة الكود كما يلي:
var str = "01234567891123456789212345678931234567894123456789" ؛
Str+= "51234567896123456789712345678981234567899123456789/N" ؛
var result = "" ؛
لـ (var i = 0 ؛ i <2000 ؛ i ++) result+= str ؛
في خطوة واحدة فقط ، تكون سلسلة النتائج التي تم إنشاؤها 200 كيلو ، والتي تستغرق 1.1 ثانية (وهذا مرتبط بتكوين الكمبيوتر) ، وذروة وحدة المعالجة المركزية هي 100 ٪. (فعلت المزيد من الحلقات لرؤية التأثير بشكل أكثر حدًا). يمكن تخيل أن خطوة واحدة فقط من التشغيل أخذتني أكثر من ثانية ، والاقتران مع الوقت الذي تقضيه على الرموز الأخرى ، فإن وقت تنفيذ كتلة البرنامج النصي بأكمله سيكون لا يطاق. فهل هناك حل تحسين؟ هل هناك أي طريقة أخرى؟ بالطبع هناك إجابة ، وإلا سأكون هراء لكتابة هذا المقال.
طريقة أسرع هي استخدام صفيف. عند مبعثر الحلقات ، لا يكون لصقها إلى سلسلة معينة ، ولكن وضع السلسلة في صفيف ، وأخيراً استخدم Array.join ("") للحصول على سلسلة النتائج. مثال رمز:
نسخة الكود كما يلي:
var str = "01234567891123456789212345678931234567894123456789" ؛
Str+= "51234567896123456789712345678981234567899123456789/N" ؛
var result = "" ، a = new array () ؛
لـ (var i = 0 ؛ i <2000 ؛ i ++) a [i] = str ؛
النتيجة = A.Join ("") ؛ أ = خالية ؛
يمكنك اختبار واختبار الوقت الذي يستغرقه الجمع بين سلسلة من نفس الحجم. النتيجة التي اختبرتها هنا هي: <15 ميلي ثانية. يرجى ملاحظة أن وحدتها هي مللي ثانية. وهذا يعني ، الجمع بين هذه السلسلة 200k ، الاستهلاك الوقت للوميمين هو حول اثنين من الحجم. ماذا يعني ذلك؟ هذا يعني أن هذا الأخير قد أنهى عمله وعاد من الغداء ، بينما لا يزال الأول يعمل كبرودة. سأكتب صفحة اختبار. يمكنك نسخ الكود التالي وحفظه كملف HTM وفتحه على صفحة الويب لاختبار الفرق في الكفاءة بين الاثنين. على أي حال ، أنا أختبر الأول الذي يستغرق نصف دقيقة لإكماله ، والأخير الذي يستغرق 0.07 ثانية (10000 حلقة).
نسخة الكود كما يلي:
<body>
عدد أوقات الربط السلسلة <input id = "totle" value = "1000" size = "5" maxLength = "5">
<type type = "button" value = "سلسلة الربط" onClick = "method1 ()">
<type type = "button" value = "Array Assignment joinment method" onClick = "method2 ()"> <br>
<div id = "method1"> </viv>
<div id = "method2"> </viv>
<textarea id = "show"> </swertarea>
<script language = "javaScript">
<!-
// طول هذه السلسلة التي يتم تقسيمها هو 100 بايت مؤلف: Meizz
var str = "01234567891123456789212345678931234567894123456789" ؛
Str+= "51234567896123456789712345678981234567899123456789/N" ؛
// الطريقة 1
وظيفة method1 ()
{
var result = "" ؛
var totle = parseint (document.getElementById ("totle"). value) ؛
var n = new date (). getTime () ؛
لـ (var i = 0 ؛ i <totle ؛ i ++)
{
النتيجة += str ؛
}
document.getElementById ("show"). value = result ؛
var s = "طريقة الربط السلسلة: السلسلة الكبيرة المقسمة طويلة"+ result.length+ "byte ،"+
"تقسيم الوقت" + (تاريخ جديد (). getTime ()-n) + "milliseconds!" ؛
document.getElementById ("method1"). innerhtml = s ؛
}
// الطريقة 2
وظيفة method2 ()
{
var result = "" ؛
var totle = parseint (document.getElementById ("totle"). value) ؛
var n = new date (). getTime () ؛
var a = new array () ؛
لـ (var i = 0 ؛ i <totle ؛ i ++)
{
a [i] = str ؛
}
النتيجة = A.Join ("") ؛ أ = خالية ؛
document.getElementById ("show"). value = result ؛
VAR S = "Array Assignment Joinment Method: السلسلة الكبيرة المقسمة طويلة" + result.length + "بايت ،" +
"تقسيم الوقت" + (تاريخ جديد (). getTime ()-n) + "milliseconds!" ؛
document.getElementById ("method2"). innerhtml = s ؛
}
//->
</script>
أخيرًا ، سأقول بضع كلمات أخرى. هل ستنضم كل من مجموعة الأسلاك التي تستخدم الربط في المستقبل؟ هذا يعتمد على احتياجاتك الفعلية. ليست هناك حاجة لاستخدام طريقة المصفوفة لمجموعات عادية من عدة بايت أو مستويات K ، لأن فتح متغيرات الصفيف يتم استهلاكها أيضًا. إذا كان هناك أكثر من عدد قليل من مجموعات سلسلة K ، فهذا يعني أن الصفيف فعال.
أي 6.0:
طريقة الربط السلسلة: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 22،089 ميلي ثانية!
طريقة JOIND ARRAY TINGRING: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، وتستغرق 218 ميلي ثانية!
Firefox 1.0:
طريقة الربط السلسلة: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 1044 ميلي ثانية!
طريقة JOIND Array Tissionment: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 1044 ميلي ثانية!
موزيلا 1.7:
طريقة الربط السلسلة: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 1045 ميلي ثانية!
طريقة JOIND Array Tissionment: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 1044 ميلي ثانية!
Netscape 7.0:
طريقة الربط السلسلة: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 10،273 ميلي ثانية!
طريقة JOIND Array Tissionment: يبلغ طول السلسلة الكبيرة المقسمة 1010،000 بايت ، وتستغرق 1138 ميلي ثانية!
أوبرا 7.54:
طريقة الربط السلسلة: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 6968 ميلي ثانية!
طريقة JOIND Array Assignment: تتراوح طول السلسلة الكبيرة المقسمة 1010،000 بايت ، ويستغرق الربط 6922 ميلي ثانية!
تُظهر نتائج الاختبار لـ 10000 دورة أنه يمكن تحسين الكفاءة بشكل كبير في IE و Netscape ، بينما في أوبرا Firefox Mozilla ، تستغرق الطريقتان في نفس الوقت تقريبًا. يمكن أن تكون هذه البيانات كافية لتحديد أن طريقة انضمام الصفيف أفضل من الربط التقليدي للسلسلة.