-
Господа!
Может ли кто просветить (хотя бы оценочно) насколько функция с try except end медленне функции без нее в случае НЕвозникновения исключения. Ведь компилятор делает какие-то телодвижения при входе в процедуру если там есть блок try except end? Да и при выходе наверное...
Заранее благодарен!
-
CPU Window посмотри и ответь себе сам.
-
> компилятор делает какие-то телодвижения при входе в процедуру > если там есть блок try except end? Да и при выходе наверное
Угу. И совсем небольшие. Если, конечно же, не учитывать соотв.телодвижения системы.
Если это критично, то ты либо должен быть асом либо авантюристом)
-
Разница всего в парочку ассемблерных инструкций.
xor eax,eax push ebp
push Adddr push dword ptr fs:[eax] mov fs:[eax],esp
mov fs:[eax],edx jmp +$A Addr:
jmp Exception
Call DoneExcept
Потом вычисляем сколько тактов заберут инструкции. И узнаем сколько "лишнего" времени съел процессор.
-
Исчерпывающе. Спасибо!
-
Кстати, может, кто-нибудь знает, почему в функции и процедуры, содержащие работу со строками, автоматически добавляется обработка исключений, и как этого избежать (ну, кроме переписывания кода на ассемблере)?
-
Прошу прощения, не содержащие, а вызывающие другие функции, возвращающие строку. Пример: 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
ExpandEnvironmentStrings2('%PATH%');
end.
-
> почему в функции и процедуры, содержащие работу со строками, > автоматически добавляется обработка исключений
С чего ты взял ?
-
Сергей М. © (04.04.08 9:14) [7]
> С чего ты взял ?
Дизассемблер показывает.
-
> Тыщ (04.04.08 09:17) [8]
Ну если возвращаемое значение есть LargeString, то это вполне объяснимо - это тип данных с управляемым временем жизни.
-
Сергей М. © (04.04.08 9:22) [9]
Ну так эта обработка и висит мертвым грузом. Управляемое время жизни тут причем? Оно управляется LStrFromPCharLen и LStrClr в моем случае, в них обработки исключений никакой нет.
-
Если вырезать обработку исключений ручками, то код работает так же. Вопрос в том, как это убрать во время компиляции.
-
> эта обработка и висит мертвым грузом
Угу, висит. До тех пор пока дело не закончится исключением.
> Управляемое время жизни тут причем?
А ты спровоцируй искл.ситуацию при исполнении этой ф-ции и посмотри, куда уходит обработка исключнения и что реально полезного она при этом делает !
-
Сергей М. © (04.04.08 9:31) [12]
Это-то понятно, но я пишу на чистом WinAPI без обработки исключений, где надо, там сам обработку поставлю, а тут самодеятельность компилятора только раздражает.
-
> пишу на чистом WinAPI без обработки исключений > самодеятельность компилятора только раздражает
Ну так и пиши без использования типов с управляемым временем жизни, в чем проблема-то ?)
-
Сергей М. © (04.04.08 9:39) [14]
Без строк, с pchar'ами плохо и неудобно :(
-
> плохо и неудобно
Тогда забудь про "чистый WinAPI", в чем проблема-то ?)
-
Может, можно как-нибудь обмануть компилятор, чтобы не добавлял обработку исключений?
-
Не надо его обманывать, он все равно умнее тебя)
-
Сергей М. © (04.04.08 9:45) [18]
> он все равно умнее тебя)
С чего это?
|