Обложка канала

Дизайнер учит код

Канал о том, как дизайнер интерфейсов осваивает код, чтобы научиться создавать интерактивные прототипы.

Дизайнер учит код

9 лет назад
Открыть в
После поста про циклы, мне написал наш iOS-разработчик Миша. Миша сказал, что нет разницы, записывать длину массива в переменную или нет — производительность будет одинаковой. И предложил мне провести тест.

Суть теста заключается в том, чтобы заполнить пустой массив большим количеством индексов. Затем, использовать получившеюся длину массива в двух циклах. В одном цикле длина массива будет записана в переменную, а в другом — нет. Полученный результат можно сравнить с помощью метода getTime(). Про сам метод можно почитать тут.

Начнём. В этой части кода создаётся пустой массив и с помощью цикла for, в него складываются индексы:

var testI = [];

for (var i = 1; i < 100000000; i++) {
testI.push(i);
}


Цикл, в котором длина массива считается при каждой итерации:

var start1 = new Date().getTime();
for (var j = 0; j < testI.lenght; j++) {
200000000000000000000 * 3000000000000 + 30000000000000 + 100000000000000;
}
var end1 = new Date().getTime();
console.log("Операция №1 заняла: " + (end1 - start1) + " мс.");


Перед началом цикла в переменную start1 записывается начальное время, а после его выполнения в переменную end1 записывается конечное время. Затем, из конечного времени вычитается начальное и получается время выполнения цикла.

Цикл, в котором длина массива записывается в переменную:

var start2 = new Date().getTime();
for (var q = 0, max = testI.lenght; q < max; q++) {
20000000000000000000 * 3000000000000 + 30000000000000 + 100000000000000;
}
var end2 = new Date().getTime();
console.log("Операция №2 заняла: " + (end2 - start2) + " мс.");


Весь код целиком:

var testI = [];

for (var i = 1; i < 100000000; i++) {
testI.push(i);
}

var start1 = new Date().getTime();
for (var j = 0; j < testI.lenght; j++) {
200000000000000000000 * 3000000000000 + 30000000000000 + 100000000000000;
}
var end1 = new Date().getTime();
console.log("Операция №1 заняла: " + (end1 - start1) + " мс.");

var start2 = new Date().getTime();
for (var q = 0, max = testI.lenght; q < max; q++) {
20000000000000000000 * 3000000000000 + 30000000000000 + 100000000000000;
}
var end2 = new Date().getTime();
console.log("Операция №2 заняла: " + (end2 - start2) + " мс.");
//result Операция №1 заняла: 0 мс. Операция №2 заняла: 0 мс.


Результат
Практически всегда, оба цикла выполняются меньше чем за 1 миллисекунду. Я пытался нагрузить систему, чтобы время расчётов увеличилось, но у меня ничего не вышло. Можете мне написать, если знаете, как это сделать.

Вывод
1. Тесты — дело неблагодарное.
2. Можно особо не запариваться, если на производительность не влияет.
3. Миша отчасти прав. Дело в том, что разница будет видна только в том случае, если расчёты будут более существенными. Но такого варианта я пока себе не могу представить.