![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
какие накладные расходы у try except end?
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
Потом вычисляем сколько тактов заберут инструкции. И узнаем сколько "лишнего" времени съел процессор.