javascript - تحميل - تطبيقات على الجافا سكربت



لأداء الحلقة في جافا سكريبت (4)

على عكس بعض العبارات أدناه، لا يتم حساب طول صفيف على كل تكرار. طول صفيف هو خاصية التي يتم تعيينها من خلال تعديل عمليات مثل pop ، push ، shift ، unshift ، splice وهكذا دواليك.

سترى ضربة أداء طفيفة على الرغم من أن البحث عن الممتلكات لديها تكلفة أعلى من المتغير المحلي . لذلك التخزين المؤقت طول هو فكرة جيدة. ومع ذلك لن ترى فرقا كبيرا إلا إذا كنت تتعامل مع مجموعات البيانات الضخمة.

هناك حالة خاصة على الرغم من حيث يتم حساب طول في الواقع على كل التكرار. هذا هو الحال مع مجموعات عقدة هتمل. وبما أن هذه الكائنات الحية، والطول ليس خاصية بمعنى أنها مع صفيف. إذا قمت بذلك:

for (var i=0; i < collection.length; i++) {
    collection[i]
};

ثم يتم تحليل المجموعة على كل تكرار.

أما بالنسبة لتحسين حلقة، وعادة ما تستخدم هذه التقنيات للتخزين المؤقت:

// if order is of no concern, just iterate from length-1 to 0
for (var i = arr.length - 1; i >= 0; i--){
    arr[i]
};

// use the for loop statement to set up scoped variables
for (var i=0, length = arr.length; i < length; i++) {
    // do something
}

هذا السؤال له إجابة هنا:

كما يقودني بحثي إلى الاعتقاد بأن الحلقات هي أسرع التكرار بناء في لغة جافا سكريبت. كنت أفكر أيضا أن الإعلان عن قيمة طول مشروط للحلقة سيكون أسرع ... لجعله أوضح، أي مما يلي تعتقد أنه سيكون أسرع؟

مثال واحد

for(var i = 0; i < myLargeArray.length; i++ ) {
    console.log(myLargeArray[i]);
} 

المثال الثاني

var count = myLargeArray.length;
for(var i = 0; i < count; i++ ) {
    console.log(myLargeArray[i]);
} 

منطقي يلي ذلك على كل تكرار في مثال واحد الوصول إلى طول ميلارجاراي على كل التكرار هو أكثر تكلفة حسابيا ثم الوصول إلى قيمة عدد صحيح بسيط كما في المثال اثنين؟


لا أعتقد أن لديك أي شيء لتخسره من خلال الذهاب مع النسخة الثانية في كل مرة، على الرغم من أنني سوف يفاجأ إذا تم حساب طول صفيف في الواقع محسوبة من الصفر في كل مرة مع النهج الأول ما لم يحصل على تحور مجموعة في الواقع من قبل حلقة.

لا تنسى أنه يمكنك إعلان أكثر من متغير واحد في الجزء الأول من:

for(var i = 0, count = myLargeArray.length; i < count; i++ ) {
    console.log(myLargeArray[i]);
}

من جافا سكريبت عالية الأداء

تقليل العمل لكل تكرار:

//original loops
for (var i=0; i < items.length; i++){
process(items[i]);
}

var j=0;
while (j < items.length){
process(items[j++]]);
}

var k=0;
do {
process(items[k++]);
} while (k < items.length);



//minimizing property lookups
for (var i=0, len=items.length; i < len; i++){
process(items[i]);
}

var j=0,
count = items.length;
while (j < count){
process(items[j++]]);
}

var k=0,
num = items.length;
do {
process(items[k++]);
} while (k < num);


//minimizing property lookups and reversing
for (var i=items.length; i--; ){
process(items[i]);
}

var j = items.length;
while (j--){
process(items[j]]);
}

var k = items.length-1;
do {
process(items[k]);
} while (k--);

تقليل عدد التكرارات:

//credit: Jeff Greenberg
var i = items.length % 8;
while(i){
process(items[i--]);
}
i = Math.floor(items.length / 8);
while(i){
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
process(items[i--]);
}

راجع تحسين جافا سكريبت


نعم كنت على حق myLargeArray.length يجري حساب في كل تكرار حلقة (المثال الأول). link1 link2

for(var i = 0; i < myLargeArray.length; i++ ) {
    console.log(myLargeArray[i]); 
} 




for-loop