JavaScript-ում զանգվածների իտերացիայի կատարողականություն
JavaScript-ում զանգվածների իտերացիայի կատարողականություն — Ո՞ր մեթոդն է ամենաարագը
JavaScript-ում զանգվածների վրա իտերացիայի (կրկնության) տարբեր եղանակներ կան։ Բայց երբ ունենք մեծ տվյալների զանգվածներ կամ performance-ին զգայուն հավելված, ճիշտ մեթոդի ընտրությունը կարող է լուրջ տարբերություն տալ։
Այս հոդվածում համեմատելու ենք ամենահայտնի մեթոդները՝ իրենց արագությամբ, ընթեռնելիությամբ և օգտագործման նպատակով։
| Մեթոդ | Նկարագրություն |
| for | Դասական for loop |
| while | Սովորական while ցիկլ |
| for...of | ES6-ից՝ iterable-ների վրա |
| forEach | Array մեթոդ, callback-ով |
| map | Նոր զանգված վերադարձնելու համար |
| reduce | Արժեքի կուտակման համար |
| for...in | Աշխատում է ինդեքսների վրա (փոխարենը զանգվածի վրա չի առաջարկվում) |
const arr = Array.from({ length: 1_000_000 }, (_, i) => i);
console.time('for');
for (let i = 0; i < arr.length; i++) {
arr[i] * 2;
}
console.timeEnd('for');
console.time('for-of');
for (const num of arr) {
num * 2;
}
console.timeEnd('for-of');
console.time('forEach');
arr.forEach(num => num * 2);
console.timeEnd('forEach');
console.time('map');
arr.map(num => num * 2);
console.timeEnd('map');
Բոլորն անում են նույն գործողությունը՝ բազմապատկում են 2-ով։ Մենք չափում ենք միայն կատարման ժամանակը։
| Մեթոդ | Արագություն | Պարզ սինտաքս |
| for | 🏆 Ամենաարագ | Բարձր |
| while | Շատ արագ | Միջին |
| for...of | Միջին | Բարձր |
| forEach | Դանդաղ | Բարձր |
| map | Դանդաղ | Բարձր |
| reduce | Ամենադանդաղներից | Միջին |
| for...in | ❌ Վատ է զանգվածների համար | Միջին |
Դասական for ցիկլը ունի ամենացածր աբստրակցիան, և JavaScript engine-ները (ինչպես V8-ը Chrome-ում) այն լավագույնս օպտիմալացնում են։ Բացի այդ, այն չի օգտագործում callback, ինչը նվազեցնում է ֆունկցիայի կանչերի բեռը։
| Ցանկություն | Օգտագործիր |
| Ամենաարագ կատարում | for կամ while |
| Մաքուր և ընթեռնելի կոդ | map, forEach |
| Կուտակում արժեքի մեջ | reduce |
| Դինամիկ break/continue | for, for...of |
| ԴFunctional ոճ | map, filter, reduce |
await array.forEach(async (item) => {
await something(item); // ❌ async չի աշխատի as expected
});
Օգտագործիր for...of async/await-ի դեպքում.
for (const item of array) {
await something(item); // ✅ async OK
}
Երբ աշխատում ես մեծ զանգվածների հետ կամ performance-ը կարևոր է, օգտագործիր for կամ while։ Բայց եթե readability-ն առաջնային է, և տվյալների քանակը քիչ է՝ օգտվիր map, forEach, կամ reduce-ից։ Իսկ եթե performance-sensitive հավելված ես գրում (օրինակ՝ խաղ, վիզուալիզացիա կամ real-time dashboard), միշտ benchmark արա տարբերակները։