Главная страница
    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.54 MB
Время: 0.039 c
14-1096630008
Delirium
2004-10-01 15:26
2004.10.24
Читаем подпись под фотографией


14-1096744110
realscript
2004-10-02 23:08
2004.10.24
Новый проект для программеров Delphi


1-1097500966
3J106UH
2004-10-11 17:22
2004.10.24
Помощь по по listbox и memo


1-1097149277
Alex_s
2004-10-07 15:41
2004.10.24
Глюки Delphi7


1-1097165028
Cosinus
2004-10-07 20:03
2004.10.24
Возможно ли в одном StringGrid сделать множественное выделение?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский