![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Limonadni Joe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
Может кто тестил: поднимает ли оператор with производительность при обращении к простым объектам (без индексирования, без разыменования и т.п.)? А может размер исходника уменьшается? Просто в справке по Visual Basic так и написано, что этот оператор ускоряет обращение к объектам, так как адрес объекта находится только олин раз. Правда, в справке по Dilphi об этом не написано.
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Так и есть.
With компилится в загрузку в какой-нибудь из регистров (esi, edi) нужного адреса, а потом уже обращения происходят относительно этих регистров, т.е. адрес вычисляется всего 1 раз. -------------------- С уважением, г-н Посол. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Ну и соответственно на микроны повышается скорость (хотя если в большом цикле - то должно быть заметно) и уменьшается размер кода.
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Не знаю как это сказывается на скорости работы программы, а вот на скорости разработки программы сказывается заметно
|
|||
|
||||
| Vit |
|
||||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Хм... Сравнил 2 кода:
1)
2)
Разница во времени выполнения - 0.3% (быстрее с with) проверено на среднем арифметическом 10ти попыток... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
||||
|
|||||
| Cashey |
|
||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Действительно, только не в пользу with, т.к. дельфя сама предлагает набор доступных свойств и методов объекта, который набираешь, это позволяет выиграть время, а главное, позволяет контролировать правильность набора названия (и наличия) его свойств, при использовании with эта ответственность ложится на плечи разработчика (кто из вас никогда не опечатывался
А можешь привести простенький пример для иллюстрации? -------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||
|
|||||
| Cashey |
|
||||||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Я вот тоже решил сравнить
Значит написал, откампилировал, перезагрузил комп (для чистоты эксперимента), запустил. Результат на C1300, 128Mb, WinME: 28:54. И такой код
Значит написал, откампилировал, перезагрузил комп (для чистоты эксперимента), запустил. Результат на C1300, 128Mb, WinME: 29:03. Разница 9 сек. или 2,65%. Вроде впечетляет, вот только часто ли вам приходилось крутить цикл миллиард раз? Интересно то, что первая разница в 1 сек. проявилась только в цикле
Мое резюме такое: использовать оператор with или нет дело вкуса, на производительность это большого значения не имеет. -------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||||||
|
|||||||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Тот пример:
немного не то что я имел в виду... Если например было бы типа такого:
Ну понял, что вычисление адреса переменной должно быть посложнее чем просто a.b... Пример как это выглядит в откомпилированном виде покажу попозже... Это сообщение отредактировал(а) p0s0l - 17.9.2003, 11:28 -------------------- С уважением, г-н Посол. |
||||
|
|||||
| p0s0l |
|
||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Пример того, как работает with:
Тут разница 100мс против 60мс. Вот как компилируется вариант без with (Delphi7):
Адреса b1 и b2 вычисляются при каждом проходе цикла. Вот как компилируется вариант с with:
Как видно, адреса b1 и b2 вычисляются только один раз до цикла и помещаются в регистры ecx и edx. Если отключить оптимизацию, то по скорости получится 250 против 90... Многое зависит от сложности вычислений и структуры записи/объекта - может получиться и так, что с with будет медленнее, чем без with, в частности, как я полагаю, если используется одновременно несколько with. Поэтому такой совет - если нужна скорость в какой-то часто вызываемой функции (обычно связано с вычислениями и обработкой информации), то можно ПОПРОБОВАТЬ использовать with, или наоборот, убрать его (если уже стоит), т.к. с каждой версией Дельфи оптимизатор кода становится всё круче и круче, а with в некоторых случаях не дает ему поля для маневра... -------------------- С уважением, г-н Посол. |
||||||
|
|||||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Вообще-то это странно. Оптимизатор вполне мог бы и заметить, что значение переменных в цикле не меняется, а значит можно вычислить их один раз и запихать в регистры и без всякого with. Правда возможно это уже будет в сторону того, что называют "агрессивная оптимизация". -------------------- Волны гасят ветер... |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Fantasist - да, оптимизатор в этом случае почему-то не оптимизировал это, хотя например циклы такого рода:
for i := 0 to n do a[i].param := i; он оптимизирует нормально: перед циклом загружает в один из регистров адрес a[0], а потом уже в цикле увеличивает этот регистр на размер a[i], а в каком-нибудь другом регистре хранит обратный счетчик (от n к нулю) - т.е. если захочешь узнать значение i - простым способом никак не узнать, т.к. её уже нигде нет... Т.е. оптимизатор может узнать, на сколько меняется адрес переменной в цикле. А в том примере почему-то не додумался, что адрес вообще постоянный. Может дело в том, что массив двумерный ? Ну это простой пример, но я иногда удивляюсь тому, до чего додумывается оптимизатор - если в следующий раз увижу какую-нибудь классную оптимизацию, то покажу её здесь (если не забуду)... Это сообщение отредактировал(а) p0s0l - 18.9.2003, 06:36 -------------------- С уважением, г-н Посол. |
|||
|
||||
| Cashey |
|
||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
По поводу оптимизаторов, я тут открыл топик http://forum.vingrad.ru/index.php?act=ST&f=21&t=12652, в котором развил тему продемонстрированного здесь эксперимента. Так вот в развитии темы: ОБРАТИТЕ ВНИМАНИЕ с оптимизатором Rain 1.0 скорость выполнеия цикла с with
составило 26 мин. 50 сек., а кода без with
составило 26 мин. и 17 сек.!!!!!!!! Вот вам и оптимизация. -------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||
|
|||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Если взглянуть на инструкцию with с точки зрения хорошего стиля, то официально дядя Борман (т.е. Borland) рекомендуют следующее:
Инструкции with необходимо применять при достаточных на то основаниях и с большой осторожностью. Не следует злоупотреблять использованием иструкций with вообще и количеством применяемых в них объектов и записей в частности. Например, программные строки:
могут ввести программиста в заблуждение и/или послужить причиной появления ошибок, которые в последствии будет трудно выявить. Хороший стиль - это накопленный опыт. Хороший стиль плохого не советует. -------------------- |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Вот, вот я сам всегда такого мнения придерживался. Читать код с with тяжелее, чем без него. Особенно когда идет вложенный with - это вообще капец.
Сама по себе двумерность массива роли не играет никакой - адрес то все равно вычисляется один. Но дело в том, что эта оптимизация потенцильно опасна для много поточных приложений. Если ты передал переменную в другой поток, а в этом цикле пытаешься мониторить ее значение, то оптимизатор тебя сильно обламает вычислив ее значение в самом начале. -------------------- Волны гасят ветер... |
||||
|
|||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Дак это многопоточные проги ! Да и там я буду знать где можно использовать with, а где нельзя...
Я конечно, не фанат with, но такое меня не устраивает: TMyWebLoader(MyLoader).Job.Items.Delete(TMyWebLoader(MyLoader).Job.Items.Count-1); по-моему легче прочитать это: with TMyWebLoader(MyLoader).Job.Items do Delete(Count-1); И бывают цепочки подлиннее... -------------------- С уважением, г-н Посол. |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |