![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
какие накладные расходы у try except end?
Jolik © (2008-03-28 15:50:00)Господа!
Может ли кто просветить (хотя бы оценочно) насколько функция с try except end медленне функции без нее в случае НЕвозникновения исключения.
Ведь компилятор делает какие-то телодвижения при входе в процедуру если там есть блок try except end? Да и при выходе наверное...
Заранее благодарен!
Игорь Шевченко (2008-04-04 13:01:00) [41]
> Причем здесь это ? Это само собой.
Это не само собой. Это именно то, что делает компилятор при встрече конструкции try...{finally|except} - вставляет формирование блока обработки исключительной ситуации - N команд в начале блока, N команд в конце.
Тыщ (2008-04-04 13:01:00) [42]Сергей М. © (04.04.08 12:47) [60]
> Причем здесь это ? Это само собой.
> Я про код финализации защищаемого блока, обращение к которому компилятор обязательно будет пытаться вставить в результ.код.
А причем здесь код финализации? Я про него вообще не говорил.
Я говорил про блок обработки исключений, а он зашит в компиляторе. С чем не согласны?
http://tysch.narod.ru/test11.zip
Вот, убедитесь, никакого _IntfClear там нет.
Сергей М. (2008-04-04 12:47:00) [43]
> System.pas пока что не могу показать
А без него сравнение бессмысленно.
Так что будем пока считать твои утверждения голословными)
> где написано mov fs:[eax],esp
Причем здесь это ? Это само собой.
Я про код финализации защищаемого блока, обращение к которому компилятор обязательно будет пытаться вставить в результ.код.
А к чему обращаться-то, если ты покоцал system и выкорчевал оттуда все непонятное и посему якобы ненужное ?)
Тыщ (2008-04-04 12:36:00) [44]Сергей М. © (04.04.08 12:21) [56]
>> exe-шник показать?
>Ага.
http://tysch.narod.ru/test10.zip
System.pas пока что не могу показать.
Сергей М. © (04.04.08 12:31) [58]
Ткните меня носом, где написаноmov fs:[eax],esp, пожалуйста.
Сергей М. (2008-04-04 12:31:00) [45]
> Она защита где-то в компиляторе
Да ты что ?!
А мужики-то и не знали)
И это они сами придумали:
procedure _HandleFinally;
asm
{$IFDEF PC_MAPPED_EXCEPTIONS}
{$IFDEF PIC}
MOV ESI, EBX
{$ENDIF}
CMP ECX, UW_EXC_CLASS_BORLANDCPP // C++ exception?
JNE @@handleIt // nope, handle it
// unwinding a C++ exception. We handle that specially.
PUSH EAX
PUSH EDX
PUSH ECX
MOV EDX, [ESP+12]
CALL EDX
POP ECX
POP EDX
POP EAX
CALL SysRaiseCPPException
@@handleIt:
PUSH EAX
PUSH EDX
CALL UnblockOSExceptions
POP EDX
POP EAX
// If the exception is a Delphi exception thrown from C++, coopt it.
CALL MaybeCooptException
MOV EDX, [ESP]
CALL NotifyExceptFinally
PUSH EAX
{$IFDEF PIC}
MOV EBX, ESI
{$ENDIF}
{
Mark the current exception with the EBP of the handler. If
an exception is raised from the finally block, then this
exception will be orphaned. We will catch this later, when
we clean up the next except block to complete execution.
See DoneExcept.
}
MOV [EAX].TRaisedException.HandlerEBP, EBP
CALL EDX
POP EAX
{
We executed the finally handler without adverse reactions.
It's safe to clear the marker now.
}
MOV [EAX].TRaisedException.HandlerEBP, $FFFFFFFF
PUSH EBP
MOV EBP, ESP
CALL SysRaiseException // Should be using resume here
{$ENDIF}
{$IFDEF MSWINDOWS}
{ -> [ESP+ 4] excPtr: PExceptionRecord }
{ [ESP+ 8] errPtr: PExcFrame }
{ [ESP+12] ctxPtr: Pointer }
{ [ESP+16] dspPtr: Pointer }
{ <- EAX return value - always one }
MOV EAX,[ESP+4]
MOV EDX,[ESP+8]
TEST [EAX].TExceptionRecord.ExceptionFlags,cUnwindInProgress
JE @@exit
MOV ECX,[EDX].TExcFrame.desc
MOV [EDX].TExcFrame.desc,offset @@exit
PUSH EBX
PUSH ESI
PUSH EDI
PUSH EBP
MOV EBP,[EDX].TExcFrame.hEBP
ADD ECX,TExcDesc.instructions
CALL NotifyExceptFinally
CALL ECX
POP EBP
POP EDI
POP ESI
POP EBX
@@exit:
MOV EAX,1
{$ENDIF}
end;
Сергей М. (2008-04-04 12:21:00) [46]
> Тыщ (04.04.08 12:17) [55]
> exe-шник показать?
Ага.
И исх.текст system.pas.
Тыщ (2008-04-04 12:21:00) [47]Сергей М. © (04.04.08 12:14) [53]
>И при этом компилятор упорно вставляет блок и все работает ?
>Даже если в покоцаном system нет ни намека на п/п HandleFinally ?
В System.pas нигде нет конструкции, отвечающей именно за блоки обработки исключений. Она защита где-то в компиляторе, то есть, в dcc32.exe.
Тыщ (2008-04-04 12:17:00) [48]Сергей М. © (04.04.08 12:09) [52]
> А кто тебя заставляет пользоваться п/программами, занимающимися именно таким вычислением ?
Давайте закончим обсуждение нуль-терминированных строк на том, что в нуль-терминированной строке нельзя хранить бинарные данные, содержащие нули.
> И где здесь аргумент, отрицающий факт присутствия в образе исп.модуля машкода, соответствующего, например, ф-ции _IntfClear ?
В program.map перечислены все используемые функции и переменные.
Вам exe-шник показать?
Сергей М. (2008-04-04 12:16:00) [49]
> будущий
Это я сморозил.
Сергей М. (2008-04-04 12:14:00) [50]
> я использую свои собственные System.pas и Sysinit.pas
И при этом компилятор упорно вставляет блок и все работает ?
Даже если в покоцаном system нет ни намека на п/п HandleFinally ?
Чудеса)
Впрочем, покоцал исп.модуль ты сам, а не компилятор.
Компилятор честно включил весь машкод сист.юнитов в будущий объектный код)
Сергей М. (2008-04-04 12:09:00) [51]
> размер его вычисляется не позицией #0
А кто тебя заставляет пользоваться п/программами, занимающимися именно таким вычислением ?
> program.map
И где здесь аргумент, отрицающий факт присутствия в образе исп.модуля машкода, соответствующего, например, ф-ции _IntfClear ?
Тыщ (2008-04-04 12:02:00) [52]Естественно, я использую свои собственные System.pas и Sysinit.pas.
Тыщ (2008-04-04 12:01:00) [53]Сергей М. © (04.04.08 11:54) [49]
> Какая такая "обрежет", если ты сознательно работаешь с буфером строки как с областью памяти, содержащей произвольные бин.данные ?
Буфер - это уже не нуль-терминированная строка, и размер его вычисляется не позицией #0.
>> исключаются все неиспользуемые функции
> Где аргументы ?)
var s:string;
begin
s:='Test';
end.
program.map:
Address Publics by Value
0001:00000000 @GetMem
0001:00000010 @FreeMem
0001:00000020 Move
0001:00000080 @LStrAsg
0001:000000C4 @NewAnsiString
0001:000000F0 ExitProcess
0001:000000F8 GetProcessHeap
0001:00000100 HeapAlloc
0001:00000108 HeapFree
0001:00000110 System
0001:00000114 SysInit
0001:00000138 PROGRAM
0002:00001000 s
Сергей М. (2008-04-04 11:54:00) [54]
> Встретится там #0, и обрежет строку
Чавой-то ?!
Какая такая "обрежет", если ты сознательноработаешь с буфером строки как с областью памяти, содержащей произвольные бин.данные ?
> Вы не правы
Где аргументы ?)
clickmaker (2008-04-04 11:52:00) [55]
> Встретится там #0, и обрежет строку.
зависит от того, кто встретит
Тыщ (2008-04-04 11:48:00) [56]Сергей М. © (04.04.08 11:44) [46]
> Ты их и в нуль-терминированной строке хранить можешь, ничто этому не препятствует.
Встретится там #0, и обрежет строку.
> ...
Вы не правы, из "джентльменского набора" исключаются все неиспользуемые функции и не будут мертвым грузом.
Сергей М. (2008-04-04 11:44:00) [57]
> Тыщ (04.04.08 11:34) [45]
> в них можно хранить любые бинарные данные
Ты их и в нуль-терминированной строке хранить можешь, ничто этому не препятствует.
Там еще и сч-к имеется, а к работе со сч-ками (и не только с ним) тебе прилагается довольно увесистый "джентльменский набор" подпрограмм в составе system.pas.
Если тебе не понадобится львиная доля этих п/программ, то как насчет красоты, притом что они будут фигурировать в твоем исп.модуле мертвым грузом ?)
Сергей М. (2008-04-04 11:34:00) [58]Понимаешь ли, создавать своюкрасоту резонно лишь полностью постигнув чужую)
Тыщ (2008-04-04 11:34:00) [59]Сергей М. © (04.04.08 11:32) [43]
> Ведь длинные длинные строки содержат "лишний заголовок" !)
Их размер что-ли? Так это наоборот очень хорошо - во-первых, в них можно хранить любые бинарные данные, а во-вторых, не нужно пробегать по всей строке, чтобы вычислить длину.
Сергей М. (2008-04-04 11:32:00) [60]
> пытаюсь жонглировать паскалевскими строками
А как же насчет "ничего лишнего" ?
Ведь длинные длинные строки содержат "лишний заголовок" !)
Как же ты с этим миришься при таких амбициях ?)