Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизМножество try except finally ? Найти похожие ветки
← →
GuAV © (2004-10-03 01:42) [40]
> finally
> On E: Exception do
> DoNothing(Aoolication.MainForm.Handle);
> end;
нет ткаое не пойдёт. ошибка:
[Error] Unit1.pas(582): Undeclared identifier: "on"
[Error] Unit1.pas(582): "END" expected but "DO" found
[Error] Unit1.pas(584): "." expected but ";" found
[Fatal Error] Project1.dpr(5): Could not compile used unit "Unit1.pas"
← →
Sergey_Masloff (2004-10-03 01:42) [41]GuAV © (03.10.04 01:39) [38]
Нет в finally нельзя конечно. В эксцепт нужно я просто не то написал
← →
GuAV © (2004-10-03 01:43) [42]
> Я ж не в IDE запускаю.
так бы сразу и сказали :)
а всё же интересный результат с DoNothing :)
← →
QuestionX (2004-10-03 01:45) [43]
> Sergey_Masloff (03.10.04 01:18) [32]
> Не прав ;-)
> При except будет много тратиться на обеспечение раскрутки
> стека. Просто в нашем конкретном случае стека нет а такты
> на запоминания адреса входа в файнали тратятся. Попробуйте
> поэкспериментировать с процедурами с параметрами (еще лучше
> с рекурсией).function DoSomething(A, B, C, X: Integer): Integer;
begin
if X > 0 then
Result := A * B * C * DoSomething(A, B, C, X - 1)
else
Result := X;
end;
procedure NoTry;
begin
DoSomething(1, 1, 1, 20);
DoSomething(1, 1, 1, 20);
end;
procedure TryFinally;
begin
try
DoSomething(1, 1, 1, 20);
finally
DoSomething(1, 1, 1, 20);
end;
end;
procedure TryXcept;
begin
try
DoSomething(1, 1, 1, 20);
DoSomething(1, 1, 1, 20);
except
end;
end;
const procs: array[0..2] of procedure=
(NoTry, TryFinally, TryXcept);
procedure TForm1.Button1Click(Sender: TObject);
var
T, TestCount : Cardinal; P: procedure;
i, j: Integer; i1, i2 : tcolor;
begin
TestCount:= 1000000;
for j:=Low(procs) to High(procs) do
begin
p:=procs[j];
T := GetTickCount;
for i := 0 to TestCount do p;
T := GetTickCount - T;
if j= High(procs) then TestCount:=TestCount div 1000;
Memo1.Lines.Add(Format("procs[%d] - %d",[j, T]));
end;
end;
Результаты:
procs[0] - 1265
procs[1] - 1344 // finally
procs[2] - 1281 // except
Или я все-таки не прав ??? :))
← →
Sergey_Masloff (2004-10-03 01:49) [44]QuestionX (03.10.04 01:45) [43]
>Или я все-таки не прав ??? :))
Да фиг знает. Все же у меня впечетление что что-то не то мы меряем.
Кстати а если cdecl и stdcall поставить изменятся результаты? Я пока не пробовал.
← →
QuestionX (2004-10-03 01:56) [45]Поставил stdcall на DoSomthing:
procs[0] - 1282
procs[1] - 1312
procs[2] - 1266
← →
QuestionX (2004-10-03 01:57) [46]cdecl на время не повлияло
procs[0] - 1266
procs[1] - 1313
procs[2] - 1281
← →
Sergey_Masloff (2004-10-03 02:01) [47]QuestionX (03.10.04 01:56) [45]
У меня (пример из [43] ):
1) Обычный вызов (register)
procs[0] - 515
procs[1] - 516
procs[2] - 516
(повторяется стабильно)
2) stdcall
procs[0] - 531
procs[1] - 562
procs[2] - 547
3) cdecl
procs[0] - 532
procs[1] - 546
procs[2] - 552
Вобщем на cdecl только except проигрывает. Вобщем, какая-то фигня надо думать в чем дело.
← →
Sergey_Masloff (2004-10-03 02:04) [48]QuestionX
Самое интересное что только на твоем примере из [43] у меня стабильно оказалось что вообще ничего не влияет - я прогнал сейчас 100 раз в цикле получил 2 раза
procs[0] - 515
procs[1] - 516
procs[2] - 516
и 98 раз
procs[0] - 516
procs[1] - 516
procs[2] - 516
Ну это вообще непонятно лично мне. Есть соображения?
← →
Sergey_Masloff (2004-10-03 02:07) [49]В смысле при register
← →
QuestionX © (2004-10-03 02:44) [50]Ну если посмотреть ассемблерные листинги:
procedure NoTry;
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
ret
procedure TryFinally;
// begin
push ebp
mov ebp,esp
//try
xor eax,eax
push ebp
push $0044fcdf
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push $0044fce6
// (1) DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
ret
$0044fcdf:
jmp @HandleFinally
jmp -$1e // goto (1)
$0044fce6:
pop ebp
ret
procedure TryExcept;
// begin
push ebp
mov ebp,esp
push ebx
push esi
push edi
// try
xor eax,eax
push ebp
push $0044fd32
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
jmp +$0a // goto (2)
$0044fd32: jmp @HandleAnyException
call @DoneExcept
// (2)
pop edi
pop esi
pop ebx
pop ebp
ret
← →
QuestionX © (2004-10-03 02:49) [51]При неслабом компьютере это и будет практически одинаково
← →
GuAV © (2004-10-03 15:10) [52]procedure TryFinally;
// begin
push ebp
mov ebp,esp
//try
xor eax,eax
push ebp
push $0044fcdf
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
push $0044fce6
// (1) DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
ret // Normally executed and jumps to ...
$0044fcdf:
jmp @HandleFinally
jmp -$1e // goto (1)
$0044fce6: // ... here
pop ebp
ret
procedure TryExcept;
// begin
push ebp
mov ebp,esp
push ebx
push esi
push edi
// try
xor eax,eax
push ebp
push $0044fd32
push dword ptr fs:[eax]
mov fs:[eax], esp
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
// DoSomething
push $14
mov ecx, 1
mov edx, 1
mov eax, 1
call DoSomething
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax], edx
jmp +$0a // goto (2) // Normally executed and jumps to ...
$0044fd32: jmp @HandleAnyException
call @DoneExcept
// (2) // ... here
pop edi
pop esi
pop ebx
pop ebp
ret
В выделенном причина.
В процедуре с Finally используется ret для выхода из finally.
Ещё раз смотрим самую нижнюю строку в моей анкете.
> блок try-except не "тяжелее" try-finally (а даже легче).
> Или я не прав ?
Вы правы. блок try-except легче в случае отсутствия исключения. Однако в случае наличия - неизвестно, требует проверки.
Страницы: 1 2 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.039 c