إن كفاءة JavaScript في تكرار المصفوفات ذات السعة الكبيرة غير مرضية. لقد أجريت مقارنة ذات مرة مع مصفوفات VBS، وكانت سرعة حلقة مصفوفة VBS أسرع تقريبًا من سرعة JS ( http://community.csdn.net /Expert/TopicView. asp?id=4313487 ). نحن لا نولي اهتمامًا كبيرًا بكفاءة مصفوفات JS في البرمجة العامة: لا يمكنك حتى معرفة كفاءة المصفوفة باستخدام بضع عشرات من العناصر فقط، ولكن عدد العقد كبير، مثل الآلاف أو عشرات الآلاف إذا تم استخدام كمية كبيرة من حلقات المصفوفة، تصبح مشكلة الكفاءة هي المشكلة الأساسية التي يجب أخذها في الاعتبار. يتضمن استرجاع المصفوفات ذات السعة الكبيرة عمومًا التطبيقات التالية: المطابقة السريعة عند تحديد مربعات التحرير والسرد، والاستعلامات الشجرية، وفرز الجدول أو استرجاعه، وما إلى ذلك.
اسمح لي بإجراء اختبار أولاً، أقوم بإنشاء مصفوفة ذات سعة كبيرة:
<SCRIPT LANGUAGE="JavaScript">
var n = 100000; //السعة القصوى للمصفوفة
var a = new Array();
ل(فار أنا=0;أنا<n;i++)
{
a[i] = Math.random() +"";
}
</SCRIPT>
بهذه الطريقة، قمت بإنشاء مصفوفة أحرف بطول 100000، ثم قمت باسترجاع السلسلة التي تبدأ بـ 0.9999 وقمت بتخزينها في مصفوفة أخرى.
<لغة البرنامج النصي = "جافا سكريبت">
var n = 100000; //السعة القصوى للمصفوفة
var a = new Array();
ل(فار أنا=0;أنا<n;i++)
{
a[i] = Math.random() +"";
}
var begin = new Date().getTime();
var b = new Array();
ل(فار أنا=0;أنا<n;i++)
{
إذا (أ[i].indexOf("0.9999")==0)
{
b[b.length] = a[i];
}
}
document.write("طول الصفيف:"+ n);
document.write("<br>تستغرق طريقة الحلقة التقليدية وقتًا" + (new Date().getTime() - begin)
+" ميلي ثانية! نتائج الاسترجاع: <strong title='"+ b.join(" ")
+"'>سجلات "+ b.length +" التي تم استرجاعها!</strong>");
</SCRIPT>
تستغرق هذه الخطوة من العملية حوالي 2800 مللي ثانية للشرح، والحلقة هنا بسيطة جدًا، ولا يوجد سوى حكم if وعملية التعيين، وهي بسيطة جدًا. وسوف يستغرق المزيد من الوقت سيكون أمرا من حيث الحجم الزيادة. فهل هناك أي حلول جيدة لتحسين هذه المشكلة؟ الجواب بالطبع نعم، وإلا فإن كل ما سأقوله في هذه التدوينة سيكون مضيعة للكلمات. ولكن لم يعد بوسعنا استخدام تفكيرنا التقليدي لتحسين هذه المشكلة، لأنه لا يمكن العثور على طريقة أفضل للكتابة في التفكير التقليدي.
الحل هو: قم أولاً بضم () المصفوفة إلى سلسلة كبيرة، ثم استخدم التعبيرات العادية لمطابقة السلسلة الكبيرة واسترجاعها. يمكن اعتبار هذه الطريقة أصالتي الشخصية، فقد توصلت إلى خدعة ملتوية أثناء عملية كتابة الأشجار، لكن الكفاءة ليست سيئة حقًا. لقد ناقشت بالفعل كفاءة join() ( http://blog.csdn.net/meizz/archive/2005/12/14/552260.aspx سرعة JavaScript: كفاءة الجمع بين السلاسل وربطها). تتطلب خطة التحسين هذه مستوى معينًا من مهارات التعبير العادي.
<معرف الإدخال = "العدد" القيمة = "50000" الحجم = "7" الحد الأقصى للطول = "6">
<input type = "button" value = "صفيف هوا الأولي" onclick = "txt.innerHTML = array_init ()"><br>
<input type = "button" value = "الحلقة التقليدية" عند النقر = "txt.innerHTML +=method_for ()">
<input type = "button" value = "المطابقة العادية" onclick = "txt.innerHTML +=method_regexp ()">
<div id="txt"></div>
<SCRIPT LANGUAGE="JavaScript">
var txt = document.getElementById("txt");
var a = new Array()
;
{
var n = parseInt(document.getElementById("count").value);
أ. الطول = 0؛
ل(فار أنا=0;أنا<n;i++)
{
a[i] = Math.random() +"";
}
إرجاع "طول المصفوفة:"+ n;
}
طريقة الدالة_for()
{
فار ن = أ. الطول؛
var begin = new Date().getTime();
var b = new Array();
ل(فار أنا=0;أنا<n;i++)
{
إذا (أ[i].indexOf("0.9999")==0)
{
b[b.length] = a[i];
}
}
return ("<br>تستغرق طريقة الحلقة التقليدية وقتًا" + (new Date().getTime() - begin)
+" ميلي ثانية! نتائج الاسترجاع: <strong title='"+ b.join(" ")
+"'>سجلات "+ b.length +" التي تم استرجاعها!</strong>");
}
طريقة الدالة_regexp()
{
var begin = new Date().getTime();
var b = new Array();
var s = a.join("x0f");
var r = new RegExp().compile("0\.9999\d+", "g");
ب = s.match(r); s = "";
return ("<br>تستغرق طريقة المطابقة العادية وقتًا" + (new Date().getTime() - begin)
+" ميلي ثانية! نتائج الاسترجاع: <strong title='"+ b.join(" ")
+"'>سجلات "+ b.length +" التي تم استرجاعها!</strong>");
}
</SCRIPT>
يمكنك اختباره لمعرفة مدى اختلاف الكفاءة بين الطريقتين المذكورتين أعلاه! لقد مات الكود، والناس على قيد الحياة. إذا قمت بتغيير تفكيرك أو نموذجك، فستكون الكفاءة مختلفة تمامًا.
لقد استغرق الأمر مني الكثير من العقول للتوصل إلى هذه الخدعة، وأنا متردد حقًا في مشاركتها. والآن سأستخدمها لتهنئة الجميع ببداية العام الجديد 2006.