Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не эффективен with, мифы, факты, мнения 
:(
    Опции темы
Nicholas_S
Дата 17.12.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 19



Цитата

Не люблю with...

можно узнать почему?


--------------------
...все в мире относительно
PM   Вверх
Aliance
Дата 17.12.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Он есть много ресурсов. И его всегда можно заменить.
У меня принцип не пользоваться некоторыми функциями и конструкциями, в их числе with и eval

Это сообщение отредактировал(а) Aliance - 17.12.2006, 17:44
PM MAIL WWW ICQ Skype   Вверх
AKS
Дата 17.12.2006, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Aliance, 
Цитата

жаль что пришлось отказаться от идеи с выбираемым текстом скрыть и показать

Объясните подробней, что нужно с текстом сделать (а то до меня обычно долго "доходит"), но уж если "дойдет", то постараюсь обязательно. Интересно, знаете ли, стало, что за проблема...
PM MAIL   Вверх
Aliance
Дата 17.12.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



В коде, который я использую сечас нет интерактирности, т.е. слова "показать" и "скрыть" - статичны. Динамичными их не сделать, т.к. в стандартных функциях IPB в добавляемом ббкоде есть синтаксис вида [tag=option]content[/tag], где я могу обратиться к option и content. content - это текст скрываемый, а если поставить в option что-либо, то это помжно было бы передавать 2 аргументом моей функции show_hide_text и далее парсить, разбивать или брать поэлементно из массива. Но саму надпись изначально поменять нельяз, т.к. в движке IPB нельзя написать что-то вроде {$options[0]}
PM MAIL WWW ICQ Skype   Вверх
Zeroglif
Дата 17.12.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Nicholas_S @  17.12.2006,  17:36 Найти цитируемый пост)
можно узнать почему?

Кому как, а мне не нравится т.к.:

- создание нового объекта в scope chain не адекватно задаче сокращения кода/обращений к чему-либо;
- интерпретатору сложнее работать;
- баги сложнее отлавливать;
- сложнее читать (ньюбам особенно, WithStatement - не такая простая вещь, как кажется);

И самое главное - подавляющее большинство спецов давно и последовательно рекомендует воздерживаться от with, равно как и от eval и т.п. Это само собой не указ, но только таким просветительским путём можно оторваться от неоптимизированного плохо написанного кода родом из девяностых, коим до сих пор полна сеть... smile
PM MAIL WWW   Вверх
Nicholas_S
Дата 17.12.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 19



Цитата

Он есть много ресурсов. И его всегда можно заменить.

Не так уж много он и ест, а код становится читабельнее.

Цитата

Но саму надпись изначально поменять нельяз, т.к. в движке IPB нельзя написать что-то вроде {$options[0]}

Можешь поменять динамически, вызвав нужный скрипт сразу после создания слоев.

Добавлено @ 18:33 
Цитата

- создание нового объекта в scope chain не адекватно задаче сокращения кода/обращений к чему-либо;
- интерпретатору сложнее работать;
- баги сложнее отлавливать;
- сложнее читать (ньюбам особенно, WithStatement - не такая простая вещь, как кажется);


1. не создавать, согласен
2. на то он интерпретатор, чтобы работать. Конечно, если выполнять операции с with в цикле миллион раз, то лучше отказаться такой конструкции. В иных случаях, где скорость играет второстепенную роль, не вижу причин чтобы не использовать.
3. если код написан неграмотно, не последовательно, кривыми руками, без форматирования... конструкция не оправдание  smile 
4. более-менее серьезные внутренние алгоритмы приложений не обязательно должны быть написаны так, чтобы чайнику было понятно


--------------------
...все в мире относительно
PM   Вверх
Aliance
Дата 17.12.2006, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата(Nicholas_S @  17.12.2006,  19:24 Найти цитируемый пост)
В иных случаях, где скорость играет второстепенную роль, не вижу причин чтобы не использовать.

Таких ситуаций нет. Спорить по этому поводу - в другой теме.
PM MAIL WWW ICQ Skype   Вверх
Zeroglif
Дата 17.12.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Nicholas_S @  17.12.2006,  18:24 Найти цитируемый пост)
на то он интерпретатор, чтобы работать

Собрал несколько ссылок по теме. Если по прочтении кто-то всё-таки решит(ся) поспорить - откройте ветку, чтобы тут не мешать.
PM MAIL WWW   Вверх
Sardar
Дата 17.12.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Тема началась отсюда, продолжение дискуссии держим здесь.

P.S. with не медленный на самом деле, это мифы древнего глючного нетскейповского кода. Но мне кажется такой код менее читабельным.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Nicholas_S
Дата 17.12.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 19



Aliance, спорить не хочу, но хочу привести пример (если нужно, можешь перенести в другую тему, создавать не буду ради одного поста). Использовать/не использовать "with" в некоторых случаях решать программисту, т.е. вам.
Код

function test1()
{
  var o = document.getElementById('ddd');
  //var o = {style: {backgroundColor: '', border: ''}}

  var d = new Date();
  var i;
  for (i=0; i<50000; i++)
  {
    o.style.backgroundColor = '#AAAAAA';
    o.style.border = 'solid 1px #AAAAAA';
  }
    
  var dd = new Date();
  return dd-d;
}

function test2()
{
  var o = document.getElementById('ddd');
  //var o = {style: {backgroundColor: '', border: ''}}

  var d = new Date();
  var i;
  with (o.style)
    for (i=0; i<50000; i++)
    {
      backgroundColor = '#AAAAAA';
      border = 'solid 1px #AAAAAA';
    }
  var dd = new Date();
  return dd-d;
}

function test3()
{
  var o = document.getElementById('ddd');
  //var o = {style: {backgroundColor: '', border: ''}}

  var d = new Date();
  var i;
  for (i=0; i<50000; i++)
    with (o.style)
    {
      backgroundColor = '#AAAAAA';
      border = 'solid 1px #AAAAAA';
    }

  var dd = new Date();
  return dd-d;
}

test1() - без использования with
test2() - с использованием with вне цикла
test3() - с использованием with внутри цикла
Плюсом объект o:
a. получает ссылку на объект DOM
b. (закоменчена) создается новый объект вне DOM дерева. Для этого случая количество итераций повышалось для точности, потому как скорость гораздо выше.

Результаты (прогонялись по несколько раз):
IE 6: a=2922,2328,2609; b=656,600,550
FF 2: a=3200,2422,2829; b=281,580,1530
OP 9: a=1250,1250,1220; b=296,375,453
NS 8: a=3350,2450,3090; b=250,547,2550
MZ 1.7: a=2950,2180,2750; b=250,610,1960

Как видим, для обоих случаев в скорости работы отличился только IE, остальные браузеры с объектами не DOM дерева работают быстрее без with - имеет смысл оператор здесь не использовать совсем. Для первого же случая, когда мы обращаемся к свойствам элемента страницы, синтаксис в внешним по отношению к циклу with выигрывает в скорости (хотя девятой Опере это по барабану, со JS она всегда работала на ура).
Этим тестом я не хочу доказать, что я прав в стремлении использовать оператор with в случаях, когда код становится более читабельным (для меня), но при этом не теряется скорость выполнения алгоритмов при грамотном написанном коде. Конечно, JS это скрипт, а не компилируемый язык, отсюда и сложность работы интерпретатора, и замедление в тесте b. Плюсуем комментарии умных людей, которые вы привели в соседней теме, и делаем вывод, что использовать его есть зло. Но радужные обещания нескольких известных всем компаний по поводу того, что в скором, возможно, появится "полноценный компилятор" для этого языка, который увеличит быстродействие на порядок, лично меня убеждает в том, что with-оператор не отменят и его использование будет оправданным.

P.S. дабы не показаться тупо голословным новичком в JS, приведу некоторые из своих работ:
http://dhtml-menu.com/tree-examples/tree-menuxp.htm
http://deluxe-menu.com/
http://dhtml-menu.com/dhtml-tab-menu/tab-menu-mac.html
http://dhtml-menu.com/dhtml-tabs/
(за работу самих сайтов прошу заранее извинить, ибо их поддержку завершил год назад)

Добавлено @ 22:08 
пардон за начало поста, изначально писал для прошлой темы, где нельзя было спорить  smile 


--------------------
...все в мире относительно
PM   Вверх
Zeroglif
Дата 17.12.2006, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Nicholas_S @  17.12.2006,  22:07 Найти цитируемый пост)
дабы не показаться тупо голословным новичком в JS

Не боись, ты таким не кажешься. Наоборот. smile

Цитата(Nicholas_S @  17.12.2006,  22:07 Найти цитируемый пост)
Плюсуем комментарии умных людей, которые вы привели в соседней теме, и делаем вывод, что использовать его есть зло.

Я привёл ссылки на рекомендации не просто умных людей (хотя и этого было бы достаточно), а разработчиков J(ava)Script, это важно, т.к. заглянуть на кухню реальной оптимизации без них практически невозможно. Если один разработчик пишет, что:

Цитата

It makes the code slower, it eliminates our ability to do compiler optimizations.  The with block in JScript is a terrible programming construct.  It makes your programs slower, harder to understand, brittle in the face of changes and generally more bug prone. Do not use it!

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

Что касается теста, то он некорректный, т.к. в test1 закеширован document.getElementById('ddd') , а надо бы document.getElementById('ddd').style. Лишняя прогулка. Это сразу выводит первый тест на первое же место. У меня (на загруженной системе):

Код

IE6.0 - 2800, 3050, 3450;
FF1.5 - 2780, 3400, 4500;
OP9.0 - 1450, 1680, 1680;

http://www.404.googlepages.com/test_with_s...ment_speed.html

p.s. Хотя имхо скорость тут - последний минус в ряду минусов. 
PM MAIL WWW   Вверх
Nicholas_S
Дата 18.12.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 19



Цитата

Что касается теста, то он некорректный, т.к. в test1 закеширован document.getElementById('ddd') , а надо бы document.getElementById('ddd').style. Лишняя прогулка. Это сразу выводит первый тест на первое же место

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

Добавлено @ 00:50 
P.S. with пришел ко мне еще со времен ранних версий Delphi, поэтому отказаться от него в некоторых ситуациях сложновато  smile 


--------------------
...все в мире относительно
PM   Вверх
Zeroglif
Дата 18.12.2006, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(Nicholas_S @  18.12.2006,  00:48 Найти цитируемый пост)
С этим согласен

Там даже знаешь чего..., надо бы в третьем тесте для чистоты заменить with (o.style) на with (o) , a в переменную o положить тоже style, как в первом тесте (у меня). Тогда третий тест в некоторой степени по lookup сравняется с первым, при каждом проходе будем сначала вычислять сам o, а потом его свойства. И третий тест ускорится (может и сравняется с первым).

А во втором можно оставить всё как есть, объект вычисляется один раз, а уже потом крутятся циклы, но тут есть побочный эффект в виде идентификатора  i, который сначала вычисляется в контексте o.style, видимо это и замедляет работу.

Цитата(Nicholas_S @  18.12.2006,  00:48 Найти цитируемый пост)
отказаться от него в некоторых ситуациях сложновато

Понятно, мы тут все не без греха (в смысле со своими вредными привычками)...  smile 

Код

IE6.0 - 2800, 3050, 2900;
FF1.5 - 2780, 3350, 3700;
OP9.0 - 1450, 1680, 1600;

http://www.404.googlepages.com/test_with_s...nt_speed_2.html

Это сообщение отредактировал(а) Zeroglif - 18.12.2006, 01:21
PM MAIL WWW   Вверх
Nicholas_S
Дата 18.12.2006, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 19



Zeroglif, вообще, было бы времени свободного чуть больше, можно было бы сделать тест из какой-нибудь реальной задачи (благо код есть в наличии). Может быть попробовать ради чистоты эксперимента вынести набор операций в функцию, чтобы идентификатор i не был в контексте объекта.


--------------------
...все в мире относительно
PM   Вверх
AKS
Дата 18.12.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Вот, решил поделиться впечатлением от прочитанного из ссылок по этой теме. В общем и целом впечатление одно, и его можно выразить цитируя человека по имени Brendan Eich. 
В одном из форумов предварительно было выяснено следующее - сегодня всем должно быть понятно, что with  в JavaScript совершенно бесполезная (местами вредная) конструкция. После этого Брендану был задан вопрос:
 -  Почему в 1995 году поддержка with в LiveScript казалась хорошей идеей?
На этот вопрос Брендан ответил так (правда с оговоркой на то, что если ему не изменяет память, то...):
 - ... это было не более, чем (желание услышать возгласы типа) "О-о-о, у вас есть поддержка оператора with - это круто!".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1229 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.