Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.57 MB
Время: 0.024 c
14-1097074167
Knight
2004-10-06 18:49
2004.10.24
Вопрос к москвичам... у которых даже Мегафон не как у всех...


14-1096648446
Abuzer
2004-10-01 20:34
2004.10.24
FreeReport


3-1096360864
Denizzz
2004-09-28 12:41
2004.10.24
из DBF в Firebird 1.5


14-1096595238
Думкин
2004-10-01 05:47
2004.10.24
С днем рождения! 1 октября


1-1095717348
ArchValentin
2004-09-21 01:55
2004.10.24
ТАймер