Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

какие накладные расходы у try except end?


Страницы:   1 2 3 4 5 6

Jolik ©   (2008-03-28 15:50:00) 

Господа!

Может ли кто просветить (хотя бы оценочно) насколько функция с try except end медленне функции без нее в случае НЕвозникновения исключения.
Ведь компилятор делает какие-то телодвижения при входе в процедуру если там есть блок try except end? Да и при выходе наверное...

Заранее благодарен!


Тыщ   (2008-04-04 09:51:00) [81]

Сергей М. ©   (04.04.08 9:48) [20]

О чем и говорилось в [5]:
> кроме переписывания кода на ассемблере

Сергей М. ©   (04.04.08 9:49) [21]

Ну-ну...


Сергей М.   (2008-04-04 09:49:00) [82]


> С чего это?


Он мне по секрету на ушко шепнул)


Сергей М.   (2008-04-04 09:48:00) [83]

Впрочем, если геморрой на собственный зад тебя не страшит, готовь данные и вызывай функции с использованием basm, тогда компилятор махнет на твои извращения рукой)


Тыщ   (2008-04-04 09:47:00) [84]

Сергей М. ©   (04.04.08 9:45) [18]

> он все равно умнее тебя)

С чего это?


Сергей М.   (2008-04-04 09:45:00) [85]

Не надо его обманывать, он все равно умнее тебя)


Сергей М.   (2008-04-04 09:42:00) [86]


> плохо и неудобно


Тогда забудь про "чистый WinAPI", в чем проблема-то ?)


Тыщ   (2008-04-04 09:42:00) [87]

Может, можно как-нибудь обмануть компилятор, чтобы не добавлял обработку исключений?


Тыщ   (2008-04-04 09:41:00) [88]

Сергей М. ©   (04.04.08 9:39) [14]

Без строк, с pchar'ами плохо и неудобно :(


Сергей М.   (2008-04-04 09:39:00) [89]


> пишу на чистом WinAPI без обработки исключений
> самодеятельность компилятора только раздражает


Ну так и пиши без использования типов с управляемым временем жизни, в чем проблема-то ?)


Тыщ   (2008-04-04 09:35:00) [90]

Сергей М. ©   (04.04.08 9:31) [12]

Это-то понятно, но я пишу на чистом WinAPI без обработки исключений, где надо, там сам обработку поставлю, а тут самодеятельность компилятора только раздражает.


Сергей М.   (2008-04-04 09:31:00) [91]


> эта обработка и висит мертвым грузом


Угу, висит.
До тех пор пока дело не закончится исключением.


> Управляемое время жизни тут причем?


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


Тыщ   (2008-04-04 09:30:00) [92]

Если вырезать обработку исключений ручками, то код работает так же.
Вопрос в том, как это убрать во время компиляции.


Тыщ   (2008-04-04 09:28:00) [93]

Сергей М. ©   (04.04.08 9:22) [9]

Ну так эта обработка и висит мертвым грузом. Управляемое время жизни тут причем? Оно управляется LStrFromPCharLen и LStrClr в моем случае, в них обработки исключений никакой нет.


Сергей М.   (2008-04-04 09:22:00) [94]


> Тыщ   (04.04.08 09:17) [8]


Ну если возвращаемое значение есть LargeString, то это вполне объяснимо - это тип данных с управляемым временем жизни.


Тыщ   (2008-04-04 09:17:00) [95]

Сергей М. ©   (04.04.08 9:14) [7]

> С чего ты взял ?

Дизассемблер показывает.


Тыщ   (2008-04-04 09:14:00) [96]

Прошу прощения, не содержащие, а вызывающие другие функции, возвращающие строку.

Пример:
function ExpandEnvironmentStrings2(const s:string):string;
var Buffer:pchar;
   Size:cardinal;
begin
 Size:=ExpandEnvironmentStrings(pchar(s),nil,0);
 GetMem(Buffer,Size);
 Size:=ExpandEnvironmentStrings(pchar(s),Buffer,Size);
 SetString(Result,Buffer,Size-1);
 FreeMem(Buffer);
end;

begin
 // Тут как будто есть блок try..except..end
 ExpandEnvironmentStrings2('%PATH%');
end.


Сергей М.   (2008-04-04 09:14:00) [97]


> почему в функции и процедуры, содержащие работу со строками,
>  автоматически добавляется обработка исключений


С чего ты взял ?


Тыщ   (2008-04-04 09:10:00) [98]

Кстати, может, кто-нибудь знает, почему в функции и процедуры, содержащие работу со строками, автоматически добавляется обработка исключений, и как этого избежать (ну, кроме переписывания кода на ассемблере)?


Jolik   (2008-03-28 17:13:00) [99]

Исчерпывающе.
Спасибо!


Thrasher   (2008-03-28 16:59:00) [100]

Разница всего в парочку ассемблерных инструкций.

xor eax,eax  //только когда есть try, except
push ebp
push Adddr //только когда есть try, except
push dword ptr fs:[eax] //только когда есть try, except
mov fs:[eax],esp //только когда есть try, except

//текст процедурі, где может возникнуть исключение

mov fs:[eax],edx //только когда есть try, except
jmp +$A //только когда есть try, except
Addr:
jmp Exception //только когда есть try, except

Call DoneExcept //только когда есть try, except



Потом вычисляем сколько тактов заберут инструкции. И узнаем сколько "лишнего" времени съел процессор.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо