2014 While
повернувся
Просто думаю логічно.
Подивись на це
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Потрібно створити принаймні 2 змінні (індекс, довжина)
- Потрібно перевірити, чи індекс менший за довжину
- Потрібно збільшити індекс
for
цикл має 3 параметри
Тепер скажіть мені, чому це має бути швидше, ніж:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Одна змінна
- Жодних чеків
- індекс знижується (машини віддають перевагу тому)
while
має лише один параметр
Мене зовсім збентежило, коли Chrome 28 показав, що цикл for for швидше. Це, мабуть, має якесь бен
"Е, всі використовують цикл for, давайте зосередимося на цьому, розробляючи для хромування."
Але зараз, у 2014 році цикл while знову на хромі. це в 2 рази швидше, в інших / старших браузерах це було завжди швидше.
Нещодавно я зробив кілька нових тестів. Зараз у реальному світі цих коротких кодів нічого не вартує, і jsperf насправді не може виконати належним чином цикл while, тому що він повинен відтворити array.length, який також потребує часу.
ви не можете отримати фактичну швидкість циклу часу на jsperf.
вам потрібно створити власну власну функцію та позначити це window.performance.now()
І так ... певний шлях циклу просто не відбувається.
Справжньою проблемою є насправді маніпуляція куполом / час візуалізації / час малювання або як би ви хотіли це назвати.
Наприклад, у мене є сцена на полотні, де мені потрібно обчислити координати та зіткнення ... це робиться між 10-200 мікросекундами (не мілісекундами). насправді потрібні різні мілісекунди, щоб все вийшло. Так само, як і в DOM.
АЛЕ
Існує ще один надзвичайно ефективний спосіб використання loop
у деяких випадках ... наприклад, для копіювання / клонування масиву
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Зверніть увагу на налаштування параметрів:
- Те саме, що в циклі while я використовую лише одну змінну
- Потрібно перевірити, чи не перевищує показник 0;
- Як ви бачите, цей підхід відрізняється від нормального для циклу, який використовує кожен, як і я всередині 3-го параметра, і я також зменшуюсь безпосередньо в масиві.
Це сказав, що це підтверджує, що такі машини, як
писав, що я думав зробити трохи коротше і видалити непотрібні речі, і написав цей, використовуючи той самий стиль:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Навіть якщо це коротше, схоже, що використання ще i
одного разу сповільнює все. Це на 1/5 повільніше, ніж попередній for
цикл і той while
.
Примітка:;
дуже важливо після того , як для looo без{}
Навіть якщо я щойно сказав вам, що jsperf - це не найкращий спосіб тестування скриптів .. я додав сюди дві петлі
http://jsperf.com/caching-array-length/40
І ось ще одна відповідь про продуктивність у javascript
https://stackoverflow.com/a/21353032/2450730
Ця відповідь полягає в тому, щоб показати виконавські способи написання JavaScript. Тож якщо ви не можете цього прочитати, запитайте, і ви отримаєте відповідь або прочитаєте книгу про Javascript http://www.ecma-international.org/ecma-262/5.1/