LINUX.ORG.RU

Нужен дельный совет по оптимизации.

 , ,


0

1

Что лучше с учётом современных браузерных движков: переопределять переменные, например, в циклах, или каждый создавать их? То есть, лучше

var i={};
for (ляляля){
 i.a='ля';
 alert(i.a);
}
или
for (ляляля){
 var i={};
 i.a='ля';
 alert(i.a);
}
?

Просто одни говорят, что переопределение объектов отбирает много времени, особенно если при этом меняется тип (а в JS даже boolean на самом деле объект), лучше пусть каждый раз создаётся новая, а ненужные сборщик мусора собирает. Другие орут, что так память быстро отжирается, лучше переменные не плодить, всё определять один раз. Посоветуй, лорчанин, как оно лучше. Желательно всё-таки исходя из личного опыта.

//Рассматривается, естественно, случай, когда на логику кода это никак не влияет.

Больше экономии будет от того что ты бросишь маяться ерундой.

Тем более с алертом в цикле об оптимизации даже не заикайся.

Kalashnikov ★★★
()

в случае v8 пофигу, а ИЕ/мозилле хз даже

umren ★★★★★
()

В твоём случае тащемта без разницы, js-машина тут хорошо оптимизирует.

И что-бы самому не померить?

t=Date.now()

....

console.log(Date.now()-t)

Debasher ★★★★★
()

в реалиях современных лучше таким вообще не маяться, как уже подсказали, оно все равно каждый релиз меняется и лучше самого движка ты не оптимизируешь. можно считать хлебные крохи, сегодня что-то будет правдой завтра уже нет, http://jsperf.com/ или как-там, зайди да накатай тестов, память все равно будет течь, отжираться, производительность проседать, c'est

trashymichael ★★★
()
Последнее исправление: trashymichael (всего исправлений: 1)
Ответ на: комментарий от Kalashnikov

Тем более с алертом в цикле об оптимизации даже не заикайся.

Я его туда просто так впихнул, абы было. А то вообще непонятные примеры получатся.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от MiniRoboDancer

примеры идентичны, дело в том что в браузере есть много узких мест, но это не одно из них, писать надо так как удобно, какие-то микрооптимизации в коде яваскрипт это ваще по-моему

trashymichael ★★★
()

JS хорош для быстрого прототипирования, пользуйся этим. Накатай решение, которое будет работать, а потом если останется время - вылизывай его. Если будешь углубляться в преждевременные оптимизации, не закончишь основную функциональность никогда и всем будет все равно, насколько быстро твой код не работает

marvin_yorke ★★★
()

первый вариант будет работать гораздо быстрее, но

for (ляляля){
 alert('ля');
}
будет работать еще быстрее.

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 2)

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

cdshines ★★★★★
()
Ответ на: комментарий от special-k

зачем нужно это изменение свойства

Пример искусственный. В реальном коде довольно часто приходится использовать только в цикле переменную. Вот я и спрашиваю, лучше объявлять её внутри цикла или перед?

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от cdshines

Блин, я так и знал, что не надо было пилить эти два треда в один и тот же день - обязательно припрётся какой-нибудь человек из соседнего и это сморозит.

//А убирать руками незачем, за меня это YUI сделает.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от special-k

Об альтернативных надъязыках я знаю, в частности, о первых двух. Но они не показались мне хорошими облегчителями написания кода. Это примерно как переходить с ассемблера на сишечку и временами осознавать, что хоть компилятор и делает в общем случае всё за тебя и даже лучше, местами что-то можно было бы оптимизировать, а такой возможности нет, приходится копаться в сгенерированном компилятором коде, попутно соображая, что и откуда взялось. Между генераторами JS и JS пропасть, конечно, на несколько порядков меньше, но всё равно неприятно.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от MiniRoboDancer

лучше объявлять её внутри цикла или перед?

Лучше внутри, т.к. в этом случае инициализация и присвоение значения будет находиться в одном месте (удобнее править и т.п.). С т.з. скорости это не имеет значения, это будут абсолютно одинаково локальные переменные, с одной и той же областью видимости.

Другое дело, что к значению лучше всего обращаться через локальную переменную, а не свойство (как у тебя), и уж тем более не нужно генерировать новые объекты внутри цикла. Объекты имеет смысл генерировать, только если тебе нужно сохранить их в коллекцию (т.е. если это явная цель цикла).

special-k ★★★
()
Ответ на: комментарий от MiniRoboDancer

приходится копаться в сгенерированном компилятором коде

Да, отладка еще пока что не ахти, хоть и есть костыли типа map source, но все же профитов достаточно.

special-k ★★★
()
Ответ на: комментарий от marvin_yorke

Но это же не глубокая оптимизация. Зачем лазить по всему коду, заменяя ++ на +=1 и объявляя не там объявленные переменные, если можно приучить себя делать это сразу, пока оно ещё свежее в голове?

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от special-k

это будут абсолютно одинаково локальные переменные

Разве переменная, объявленная внутри цикла, не объявляется заново на каждой итерации?

переменную, а не свойство

Всё, что прямо не относится к вопросу, написано от фонаря. Привычки создавать объекты без причины я не имею.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от special-k

Ну вот когда оно будет готовым и с широким набором собственных фич, тогда и буду думать о переходе. А то они пока облегчают слишком специфические задачи.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от MiniRoboDancer

Разве переменная, объявленная внутри цикла, не объявляется заново на каждой итерации?

Если что-то и происходит, то совершенно несущественное.

special-k ★★★
()
Ответ на: комментарий от special-k

Если что-то и происходит, то совершенно несущественное.

Хорошенькое дельце. Вот, допустим, цикл на несколько десятков тысяч итераций. Переменная сложная, строка, например, или даже с плавающей точкой. За эти разы выделяется прилично так памяти. Сборщик мусора это всё обойти не успевает (в нормальных рантаймах он запускается только при простое, а в браузерных движках, на практике - и того реже, или эта память высвобождается некорректно). А объявить один раз - одна и та же, но каждый раз тратится процессорное время на переопределение. Несущественно?

MiniRoboDancer ★☆
() автор топика

Больше экономии будет от того что ты бросишь маяться ерундой.
в случае v8 пофигу, а ИЕ/мозилле хз даже
Все равно будет тормозить, потому, что ты не поубирал пробелы, переводы строки и отступы.

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

darkenshvein ★★★★★
()
Ответ на: комментарий от MiniRoboDancer

Несущественно?

Абсолютно. Ну проверь. Переменная - это лишь ссылка на значение находящееся в памяти. Любое значение, которое ты определил попадает в память и уходит оттуда не сразу, не зависимо от того за циклом у тебя var, или перед циклом..

special-k ★★★
()
Ответ на: комментарий от vertexua

Кстати, он хотя бы со строками работать умеет? Или только вычисления?

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от MiniRoboDancer

умные компиляторы/VM/JIT умеют детектировать такие ситуации сами. Тебе незачем париться

marvin_yorke ★★★
()
Ответ на: комментарий от darkenshvein

не майся дурью, работай, зарабатывай деньги

Как догадался?

Пользователи должны покупать новые процессоры, планки памяти и телефоны с 16х ядрами.

Смищно. У меня на фичерфоне с 200МБ памяти NetFront даже перегруженные скриптами сайты иногда нормально отображает. Там внутри какой-то обрезанный WebKit (пять лет назад, когда за него ещё не брался Гугель со своим хромоногим, он не был таким прожорливым).

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от special-k

вредные советы, толку в этом сахаре нету никакого т.к. отладка хуже, нет контроля над всеми конструкциями, лишний слой абстракции

umren ★★★★★
()
Ответ на: комментарий от anonymous

Два чая анону, коментаторы порадовали.

zz ★★★★
()
Ответ на: комментарий от umren

Это unixway

  • Избегайте ручного набора кода; при любом удобном случае пишите программы, которые бы писали программы.
  • Предпочитайте переносимость эффективности. (а здесь оба сразу).
  • И от меня: свыкайтесь с мыслью, что js - это такой байткод.
special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

Избегайте ручного набора кода; при любом удобном случае пишите программы, которые бы писали программы.

в обоих случаях ты пишешь одно и тоже, только со слегка другим синтаксисом, минусы (отладка хуже, нет контроля над всеми конструкциями, лишний слой абстракции) перевешивают плюсы (ТИПА лучше синтаксис)

Предпочитайте переносимость эффективности. (а здесь оба сразу).

ни одного ;)

И от меня: свыкайтесь с мыслью, что js - это такой байткод.

на эту роль больше подходит asm.js

umren ★★★★★
()
Ответ на: комментарий от umren

в обоих случаях ты пишешь

Ну это не я, это Eric S. Raymond пишет http://ru.wikipedia.org/wiki/Философия_UNIX#.D0.A0.D0.B5.D0.B9.D0.BC.D0.BE.D0..., и в первом случае речь идет о продвинутых текстовых редакторах, во втором о генераторах, трансляторах и т.п.

отладка хуже

Да не хуже, coffee, в частности, делает вполне человекочитаемый js.

на эту роль больше подходит asm.js

А это, по-твоему, что?)

special-k ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.