ОсновноеRadiotalkПользовательское
Программирование
6   •   Посмотреть все темы

Циклы, итерация и преопределение.

 

4875
ValdeZ @ValdeZ
Доброе время суток!
Есть вот такой кодец:



Если вкратце, то суть программы в том, что имитируется многомерный массив (напомню, в JavaScript нет "родных" многомерных массивов) и заполняется как таблица умножения.
Код не сложный, многие должны разобраться.

Теперь самое важное. Когда я изучал циклы как инструкции вообще, читал про такой момент:
Второе выражение в определении цикла следует максимально упрощать, если очень много прогонов этого цикла.
Например, стоит провести все операции вне тела цикла, а в этом проблемном моменте использовать уже известное значение.

К моему примеру это должно относиться так:
- В случае, если я оставлю в том моменте в циклах выражение rows.length, то циклу придётся при каждой итерации определять значение длинны массива. Снова и снова. Каждый раз.
- В случае, если я перед циклами создам переменную, значение которой будет равняться rows.length и буду использовать её в том месте - циклу не придётся каждый раз определять
длину массива, а попросту обращаться к переменной с этим значением, которое будет искаться только один раз - в самом начале.

Решил ради прикола это дело замерять (по времени выполнения). Поставил по тысячу прогонов, как видите. И в чём фишка:
- Если таки создать отдельную переменную как написано выше - получится 70-78мс.
- Если ничего такого не делать, а просто писать определение цикла как на скриншоте кода - 61-70мс.

Получается, что циклу быстрее каждый раз снова и снова определять длину массива, чем просто обращаться к готовому значению?
Получается, что, грубо говоря, проще каждый раз искать результат, чем найти его однажды и пользоваться все остальные итерации?


Разъясните, очень любопытно.

4875
ValdeZ @ValdeZ
UPD: Подобная непонятная фигня происходит при любой моей попытке как-либо преопределить значение rows.length.
Пытался по-разному скосить, например, одну переменную для определения массива и для его же длинны. Всё-равно время больше, чем в исходном варианте.
Почему?!

Отредактировано ValdeZ - 13.09.2010
20089
Dimitry @Dimitry
может просто вермя глючит, комп поразному нагружен )

458
ridz @ridz
ValdeZ,
**********

и дал бы код а не скриншот, может кто проверить захочет )))
<script language="JavaScript" type="text/javascript">
var start = new Date().getTime();
for(var rows=[],i=0;i<1000;i++){rows[i]=[];for(var k=0;k<1000;k++)rows[i][k]=i*k};
document.write(rows[900][200]+"<br />");
var end = new Date().getTime();
document.write(end-start)
</script>

Отредактировано ridz - 14.09.2010
4875
ValdeZ @ValdeZ
/* Начинаем замер времени. */
var start = new Date().getTime();

/* Начало программы. */
var rows = new Array(1000);


for (var i = 0; i < rows.length; i++) {
rows[i] = new Array(1000);
}

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

document.write(rows[900][200] + "<br>");

/* Замеряем время после исполнения программы. */
var end = new Date().getTime();

/* Выводим результат. */
document.write(end - start);

Вот код.
За ссылку спасибо, +1)))

Сейчас твой вариант посмотрю... заинтересовало.
Это, конечно, не для случая, когда длинна массивов не известна заранее, но всё-же нашёл упрощенный вариант своей программы.
Лишний цикл делал, сбил время ещё на 15-20%.
Ещё раз спасибо.

Отредактировано ValdeZ - 14.09.2010