Объявление переменной и скорость выполнения (компиляция, инициализация, оптимизация)

~RA~

Одарённая.
Топикстартер
12 лет на форуме
Сообщения
11 886
Реакции
3 457
В общем, с одной стороны область видимости, а с другой переинициализация, может даже с перевыделением памяти. И если заранее не знаешь, поправит за тобой компилятор/интерпретатор, то правильней инициализацию выносить из цикла. Имхо.

разница примерно
а если там не лекговесный int, а что-то потяжелее?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
И если заранее не знаешь
В данном случае вариантов нет - повторяю, во всех известных мне скриптах локальные переменные создаются вместе с родительским блоком кода. Как только доберусь до ESTK проверю именно на последних примерах
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Преждевременная оптимизация — корень всех (или большинства) проблем в программировании. © Кнут
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Темна вода во облацех адобовской javascript-реализации.
Все прозрачно. Как я и говорил, код
JavaScript:
$.hiresTimer
for (var i = 0; i < 1000000000; i++) {
    var b = i;
}
$.writeln($.hiresTimer)
var b;
$.hiresTimer
for (var i = 0; i < 1000000000; i++) {
    b = i;
}
$.writeln($.hiresTimer)
компилируется вот так
JavaScript:
var i,b;
{
$.hiresTimer;
//Line: 1
for (  i=0 ; i<0x3B9ACA00 ; i = i+1)
{
//Line: 2
b = i;
}
//Line: 4
$.writeln($.hiresTimer);
//Line: 6
$.hiresTimer;
//Line: 7
for (  i=0 ; i<0x3B9ACA00 ; i = i+1)
{
//Line: 8
b = i;
}
//Line: 10
$.writeln($.hiresTimer);
}
А посему обе части эквивалентны и то, что они у тебя работают с разной скоростью - неведомая ёлочная хвоя
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
А смысл? Если эксперимент противоречит теории - значит он был поставлен некорректно.
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
Значит, поставь эксперимент правильно. А лучше -- серию.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
У меня естк нет под рукой. А объяснений почему один и тот же кусок кода может работать с разной скоростью - миллион. От кэширования до фрагментации памяти. Вдобавок, ты ж небось текстовый вариант запускал а не бинарный.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Ну мало ли. Может на лету каждый блок кода компилит? Попробуй бинарный
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
вообще, больше всего тут интересно что

Код:
for (var i = 0; i < 100; i++) {
    var b = i;
}
var b;
$.writeln(b);

выдает 99.

поэтому я всегда теперь при объявлении переменных еще и '=undefined' им стараюсь дописывать, а то может фигня произойти.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
погрешность измерения. полсекунды тут это же какая-то неведомая доля процента.
Тем не менее, нужно ж доискаться до истины - почему идентичные куски кода работают с разной скоростью.
А они реально идентичные, могу просто в бинарнике показать для сравнения.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
не удивляет ) но по уму вроде это уже другая область видимости (scope), и объявленная внутри цикла переменная не должна быть видна вне его (?) хотя могу ошибаться
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Новогоднее чудо!
не удивляет ) но по уму вроде это уже другая область видимости (scope), и объявленная внутри цикла переменная не должна быть видна вне его (?) хотя могу ошибаться
Ну как видишь - в случае адобовского яваскрипта видимость локальных переменных - внутри функций.
 
Последнее редактирование: