Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полезность оператора with 
:(
    Опции темы
Fantasist
Дата 19.9.2003, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

Репутация: нет
Всего: 41



Цитата
Дак это многопоточные проги ! Да и там я буду знать где можно использовать with, а где нельзя...


Дык, я про оптимизатор говорю. Понятно, что ты знаешь, а вот оптимизатор нет, поэтому и не оптимизирует такой кусок, если ты ему явно with не указал. Это правда только предположение, почему он так работает. Истинной причины мы не знаем.

Цитата
Я конечно, не фанат with, но такое меня не устраивает:
TMyWebLoader(MyLoader).Job.Items.Delete(TMyWebLoader(MyLoader).Job.Items.Count-1);


В таких случае я обычно пишу:

Код


 TItems items=TMyWebLoader(MyLoader).Job.Items;
 items.Delete(items.count-1)



Потому как обычно такая строчка не одна. Да и with с одной строчкой я очень редко встречал.



--------------------
Волны гасят ветер...
PM MAIL   Вверх
p0s0l
Дата 20.9.2003, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Так... Я тут немного покомпилировал и поисследовал...
Да, без with компилируется циклы так, что адрес переменной вычисляется в каждом шаге цикла. НО! Адрес-то вычисляется не по значению переменной, а по значению РЕГИСТРА, в который заносится значение переменной еще до цикла... И как это понимать ? Если ты сказал про многопоточные проги: типа во время цикла может измениться значение этой переменной, или нужно узнать её значение - из-за оптимизатора будет облом, даже без всякого with - как интересно другой поток узнает значение какого-то регистра ?
Вот пример того, что я имел в виду:
Код
var
 i, j : integer;
 a : array [0..100] of byte;
begin
 i := 1;
 for j := 0 to 10 do
 begin
   a[i] := 5;
   inc(i, j);
 end;
end;

Тут вместо переменной i Delphi использует регистр edx... Конечно, если сделать переменную i глобальной, то будет все ОК, т.е. в каждом шаге цикла в регистр edx будет загружаться значение переменной i, вычисляться адрес в массиве и заноситься по этому адресу 5...
Ну ладно, для многопоточных случаев такие переменные - глобальные.
А обычно-то используются локальные переменные - вот еще один наглядный пример "глупости" оптимизатора:
Код
var   b : array [0..100, 0..100] of byte; // глобальный массив (для простоты)
procedure MyProc;
var
 i, j : integer;
begin
 i := 2;
 for j := 0 to 9 do
   b[i,50] := 0;
end;

Это получается так:
Код
mov edx,2
mov eax, 10
@loop:
imul ecx,edx,101
mov byte ptr [ecx + b + 50], 0
dec eax
jnz @loop

Fantasist - как ты мне это объяснишь ? Абсурд какой-то...
Вместо локальных i и j используются edx и eax -> т.е. подразумевается, что значения этих переменных больше нигде не нужны, поэтому можно засунуть их в регистр -> значит их значения не могут поменяться -> вопрос: почему бы не вынести команду imul перед циклом ?



--------------------
С уважением, г-н Посол.
PM   Вверх
Fantasist
Дата 20.9.2003, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

Репутация: нет
Всего: 41



Цитата
Fantasist - как ты мне это объяснишь ?


Оптимизатор посмотрел на это дело, подумал: что за идиот такой код написал? Вот хрен тебе отимизация - не поможет она тебе.

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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
p0s0l
Дата 21.9.2003, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
что за идиот такой код написал

Ладно, почему-то люди всегда могут конкретизировать, а абстрагировать им влом...
Я привел пример, который показывает самый глупый случай, когда адрес даже не меняется...
Вот тебе с меняющимся адресом:
Код
i := 2;
for j := 0 to 9 do
  b[i,j] := 0;

Компилится так:
Код
mov ecx,2
mov edx, 10
mov eax, offset b
@loop:
imul ebx,ecx,101
mov byte ptr [eax+ebx],0
inc eax
dec edx
jnz @loop

ТА ЖЕ САМАЯ история - ничего не поменялось практически, тот же глупый вопрос: почему imul в цикле ?

А вот как оптимизируется такое:
Код
j := 2;
for  i := 0 to 9 do
 b[i,j] := 0;

Компилится так:
Код
mov edx, 2
mov ecx, 10
mov eax, offset b
@loop:
mov byte ptr [eax+edx],0
add eax, 101
dec ecx
jnz @loop




--------------------
С уважением, г-н Посол.
PM   Вверх
Fantasist
Дата 22.9.2003, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

Репутация: нет
Всего: 41



Цитата
QUOTE
что за идиот такой код написал

Ладно, почему-то люди всегда могут конкретизировать, а абстрагировать им влом...


Это как бы шутка, вообще-то, была. Или без смайлика не считается. smile.gif

Цитата
ТА ЖЕ САМАЯ история - ничего не поменялось практически, тот же глупый вопрос: почему imul в цикле ?


Тот же самый ответ (от 20.9.2003, 15:53). Второй абзац, первые три предложения.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
p0s0l
Дата 23.9.2003, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Это как бы шутка, вообще-то, была. Или без смайлика не считается.
Да вообще-то я понял что это была шутка...
Цитата
Тот же самый ответ (от 20.9.2003, 15:53). Второй абзац, первые три предложения.

Если бы 2 предложения, то согласен, но 3... - т.е. хочешь сказать, что цикл бесполезен ? Интересная логика...
Ладно, что тут перебирать одно и тоже, закругляюсь...



--------------------
С уважением, г-н Посол.
PM   Вверх
Fantasist
Дата 24.9.2003, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

Репутация: нет
Всего: 41



Цитата
Если бы 2 предложения, то согласен, но 3...


Черт! Так и знал, что неправильно посчитают. smile.gif Предложение - это то, что кончается точкой, условно говоря. Предложение из одного слово все равно является предложением.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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