Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Множество try except finally ?   Найти похожие ветки 

 
QuestionX   (2004-10-02 19:16) [0]

Как считаете, насколько влияет большое число вложенных try except finally структур на производительность кода ?


 
TUser ©   (2004-10-02 19:20) [1]

А что такое "производительность кода"?

ИМХО - сколько надо, столько и вкладывай.


 
Sergey_Masloff   (2004-10-02 19:21) [2]

finally практически не влияет. except "тяжелее" но как правило лишняя защищенная секция. Для интерактивных приложений вообще проблемы производительности не так актуальны.


 
GuAV ©   (2004-10-02 19:22) [3]

я считаю что множество try finally нормально. try except тоже нужно но редко, множество их - ненормально.
Тормозит это имхо больше вслучае исключений, в случае их отсутствия имхо не сильно тормозит.


 
Sergey_Masloff   (2004-10-02 19:23) [4]

GuAV ©  
Разработчики VCL с тобой солидарны - finally встречается на порядок чаще except я когда-то давно интересовался проблемой и смотрел.


 
Sergey_Masloff   (2004-10-02 19:24) [5]

>но как правило лишняя защищенная секция.
лучше чем одна недостающая...
Имелось в виду. Поторопился.


 
Anatoly Podgoretsky ©   (2004-10-02 19:51) [6]

Не из торможения надо исходить, а из надежности


 
QuestionX   (2004-10-02 20:06) [7]


> Anatoly Podgoretsky ©   (02.10.04 19:51) [6]
> Не из торможения надо исходить, а из надежности

Золотые слова ;)


> Sergey_Masloff   (02.10.04 19:21) [2]
> finally практически не влияет. except "тяжелее"

А откуда такая информация ? Разве технически это не одно и тоже ?


 
GuAV ©   (2004-10-02 20:26) [8]


> Не из торможения надо исходить, а из надежности

Да, надёжность прежде всего. И так в программе есть ошибки.
Однако не следует использовать исключения не по назначинию.
Типа есть такое, когда выходят не через break/exit/goto а raise а потом except. так делать не следует.

кстати, провёл тест результат впечатляет:

procedure DoNothing;
asm
 NOP;  NOP;  NOP;   NOP;
 NOP;  NOP;  NOP;   NOP;
 NOP;  NOP;  NOP;   NOP;
end;

procedure NoTry;
begin
 DoNothing;
 DoNothing;
end;

procedure TryFinally;
begin
 try
   DoNothing;
 finally
   DoNothing;
 end;
end;

procedure TryXcept;
begin
 try
   DoNothing;
   DoNothing;
 except
 end;
end;

procedure TryXceptR;
begin
 try
   DoNothing;
   DoNothing;
   raise Exception.Create("test exception");
 except
 end;
end;

const procs: array[0..3] of procedure=
 (NoTry, TryFinally, TryXcept, TryXceptR);

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] - 15
procs[1] - 44
procs[2] - 28
procs[3] - 7805  // умножь ещё на 1000


 
Sergey_Masloff   (2004-10-02 20:28) [9]

QuestionX   (02.10.04 20:06) [7]
>Разве технически это не одно и тоже ?
Нет


 
Sergey_Masloff   (2004-10-02 20:44) [10]

GuAV ©   (02.10.04 20:26) [8]
Странно. Твой пример правильный но результат на моем компьютере:

procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 16
procs[1] - 47
procs[2] - 15
procs[3] - 3000
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000

То есть обычно
NoTry = TryFinally
но эпизодически TF намного дольше и опять одинаково. Когда Exception возникаеттам все понятно конечно.


 
GuAV ©   (2004-10-02 20:54) [11]


> procs[0] - 31
> procs[1] - 31
> procs[2] - 16

то есть, excpet бытрее чем просто ???
скорее всего у Вас крутой комп и кэш в нём настолько эффективен.
имхо следует перед тестом погонять DoNothing раз этак 5..6


 
lipskiy ©   (2004-10-02 20:56) [12]

Люди, поясните коротко, чем except и finally отличаются? И когда что использовать нужно?


 
GuAV ©   (2004-10-02 20:58) [13]

lipskiy ©   (02.10.04 20:56) [12]
смотри мою анкету - внизу.


 
DrPass ©   (2004-10-02 22:21) [14]


> Люди, поясните коротко, чем except и finally отличаются?
> И когда что использовать нужно?

секция except - это код, который должен выполняться при возникновении исключения.
Секция finally - это код, который должен выполняться независимо от того, произошло исключение, или нет


 
jack128 ©   (2004-10-02 23:05) [15]

GuAV ©   (02.10.04 20:26) [8]
Ты - вредитель!! ;-))

Народ со слабыми компами - если захотите запустить тест ГуАВ, то запускайте его ВНЕ IDE


 
GuAV ©   (2004-10-02 23:08) [16]

Не-а необязательно, нужно только отключить интегрированную отладку... надеюсь помнишь как ?


 
QuestionX   (2004-10-02 23:34) [17]


> Sergey_Masloff   (02.10.04 20:28) [9]
> finally практически не влияет. except "тяжелее"

Странно, но из

> Sergey_Masloff   (02.10.04 20:44) [10]
> результат на моем компьютере:
> procs[0] - 31
> procs[1] - 31  <--- Finally
> procs[2] - 16  <--- Except
> procs[3] - 3000

Получается, что finally тормознее except"a !
Еще раз поинтересуюсь, откуда у вас информация, что except "тяжелее" ?


 
Sergey_Masloff   (2004-10-02 23:45) [18]

QuestionX   (02.10.04 23:34) [17]
>Еще раз поинтересуюсь, откуда у вас информация, что >except "тяжелее" ?
Из понимания смысла этих операций. Для finally нужно всего лишь записать адрес начала блока так как в except требуется формирование фрейма исключения ведь нужно будет раскручивать стек для продолжения "нормальной" работы после исключения. И пример procs[3]  это наглядно показывает


 
Sergey_Masloff   (2004-10-02 23:47) [19]

Кстати точно. Там различие сильное будет на обработке стека. Так что нужно тестировать на процедурах с параметрами. Еще лучше когда одна процедура будет вызываться из другой. Там except должен быть намного тормознее.


 
GuAV ©   (2004-10-02 23:49) [20]

Sergey_Masloff   (02.10.04 23:45) [18]
ещё раз повторите тест на Р4 плиз с учётом [11], а то что Except быстрее "просто" наводит на сомнения в объективноти


 
GuAV ©   (2004-10-02 23:51) [21]

и ваще, хочу коментарии по поводу результатов в  [10].


 
lipskiy ©   (2004-10-02 23:52) [22]

DrPass ©   (02.10.04 22:21) [14]
Тенкс!


 
Sergey_Masloff   (2004-10-03 00:23) [23]

GuAV ©   (02.10.04 23:49) [20]
>ещё раз повторите тест на Р4 плиз с учётом [11],
Проверил. Delphi7, оптимизация отключена, DoNothing 6 раз перед каждым тестом. Кстати любопытная деталь - каждый раз когда TF больше (примерно на 15) тут же примерно на 15 "меньше" простой вызов. Что-то может не так меряем?
procs[0] - 32
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 32
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 2984
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 3937
procs[0] - 31
procs[1] - 31
procs[2] - 32
procs[3] - 3937
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 16
procs[1] - 47
procs[2] - 15
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 3000
procs[0] - 31
procs[1] - 31
procs[2] - 32
procs[3] - 2984
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 2984
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000
procs[0] - 16
procs[1] - 47
procs[2] - 15
procs[3] - 2985
procs[0] - 31
procs[1] - 31
procs[2] - 16
procs[3] - 3000


 
GuAV ©   (2004-10-03 00:37) [24]


> Что-то может не так меряем?

хм... Вы на кнопку Enterом давите, мышу не двигаете ?
а что если дать задержку перед первым тестом ?


 
Sergey_Masloff   (2004-10-03 00:50) [25]

GuAV ©   (03.10.04 00:37) [24]
Ну на кнопку я давлю мышем но 1 раз (сделал еще 1 цикл внешни 10 раз). Попробовал и давить кнопкой - то же самое. Сейчас привожу последний на данный момент результат - мыш не шевелилась перед каждым тестом DoNothing 6 раз и Sleep(100) - это имелось в виду под задержкой?
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2922
procs[0] - 16
procs[1] - 46
procs[2] - 16
procs[3] - 2938
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2922
procs[0] - 16
procs[1] - 31
procs[2] - 31
procs[3] - 2922
procs[0] - 16
procs[1] - 31
procs[2] - 31
procs[3] - 2922
procs[0] - 15
procs[1] - 31
procs[2] - 32
procs[3] - 2937
procs[0] - 16
procs[1] - 31
procs[2] - 32
procs[3] - 2921
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2937
procs[0] - 15
procs[1] - 31
procs[2] - 32
procs[3] - 2922
procs[0] - 15
procs[1] - 32
procs[2] - 31
procs[3] - 2937
procs[0] - 15
procs[1] - 47
procs[2] - 16
procs[3] - 2922


 
GuAV ©   (2004-10-03 00:53) [26]

Ну так лучше же результаты - procs[0] самая быстрая.
а если ещё нолик добавить ?
TestCount:= 1000000*10;
 ...TestCount div 1000*10;


 
Sergey_Masloff   (2004-10-03 01:08) [27]

GuAV ©   (03.10.04 00:53) [26]
Вот.
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 32453
procs[0] - 218
procs[1] - 391
procs[2] - 172
procs[3] - 29671
procs[0] - 219
procs[1] - 391
procs[2] - 172
procs[3] - 29703
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 29703
procs[0] - 218
procs[1] - 391
procs[2] - 172
procs[3] - 29687
procs[0] - 218
procs[1] - 407
procs[2] - 171
procs[3] - 29688
procs[0] - 219
procs[1] - 391
procs[2] - 156
procs[3] - 29704
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 29703
procs[0] - 219
procs[1] - 390
procs[2] - 172
procs[3] - 29672
procs[0] - 219
procs[1] - 391
procs[2] - 172
procs[3] - 29687
procs[0] - 219
procs[1] - 391
procs[2] - 172
procs[3] - 29750


 
GuAV ©   (2004-10-03 01:10) [28]

Sergey_Masloff   (03.10.04 01:08) [27]
мда...
а Вы можете прокоментировать ?
ЗЫ: а если попробовать вызывать в другом (случайном) порядке ?


 
QuestionX   (2004-10-03 01:11) [29]


> Sergey_Masloff   (02.10.04 23:45) [18]
> QuestionX   (02.10.04 23:34) [17]
> >Еще раз поинтересуюсь, откуда у вас информация, что >except
> "тяжелее" ?
> Из понимания смысла этих операций. Для finally нужно всего
> лишь записать адрес начала блока так как в except требуется
> формирование фрейма исключения ведь нужно будет раскручивать
> стек для продолжения "нормальной" работы после исключения.
> И пример procs[3]  это наглядно показывает

Пример из procs[3] наглядно показывает только то, что при возникновении исключения его обработка занимает продолжительное время. Но исплючительная ситуация на то и исключительная, что когда она возникает - значит что-то не в порядке и быстродействие в этом случает меня не сильно волнует. Я задал конретный вопрос о том, насколько нагружает быстродействие введение в него блоков try except finally а не насколько нагружает быстродействие возникшее исключение.
Пример же из procs[0 - 2] показывают, что вопреки вашему утверждению блок try-except не "тяжелее" try-finally (а даже легче). Или я не прав ?


 
GuAV ©   (2004-10-03 01:14) [30]


> Пример же из procs[0 - 2] показывают, что вопреки вашему
> утверждению блок try-except не "тяжелее" try-finally (а
> даже легче). Или я не прав ?

Вероятно, легче. Но ведь один другого не заменят.
Впрочем я или нахожу объяснение почему procs[2] быстрее procs[0] или результаты считаю ошибочными.


 
Sergey_Masloff   (2004-10-03 01:15) [31]

GuAV ©   (03.10.04 01:10) [28]
>а Вы можете прокоментировать ?
Нет. Но понимаю что чудес не бывает
>ЗЫ: а если попробовать вызывать в другом (случайном) порядке ?
Пробовал. Правда не в случайном а просто последовательность менял. Результат ровно такой же.


 
Sergey_Masloff   (2004-10-03 01:18) [32]

QuestionX   (03.10.04 01:11) [29]
Не прав ;-)
Ну или если все Ваши проекты состоят из не принимающих параметров процедур тело которых состоит исключительно из NOP то ;-)

При except будет много тратиться на обеспечение раскрутки стека. Просто в нашем конкретном случае стека нет а такты на запоминания адреса входа в файнали тратятся. Попробуйте поэкспериментировать с процедурами с параметрами (еще лучше с рекурсией).


 
GuAV ©   (2004-10-03 01:20) [33]

procedure TForm1.Button1Click(Sender: TObject);
var
T, TestCount : Cardinal; P: procedure;
i, j: Integer; i1, i2 : tcolor;
begin
TestCount:= 10000000;
for j:=Low(procs) to High(procs) do
begin
  p:=procs[j];
  if j= High(procs) then TestCount:=TestCount div 100;
  T := GetTickCount;
  for i := 0 to TestCount do p;
  T := GetTickCount - T;
  Memo1.Lines.Add(Format("procs[%d] - %d",[j, T]));
end;
end;

у меня такой результат:
procs[0] - 183
procs[1] - 454
procs[2] - 245
procs[3] - 841


А Вы выключили &Integrated debugging (Tools->Debugging Options) ?


 
GuAV ©   (2004-10-03 01:31) [34]

реальная ситуация - вместо DoNothing использованна процедура из ветки про быстрый поиск PosDefunct_a(S1, S2);
результат:
procs[0] - 630
procs[1] - 915
procs[2] - 695
procs[3] - 905


:confused:


 
Sergey_Masloff   (2004-10-03 01:33) [35]

GuAV ©   (03.10.04 01:20) [33]
>А Вы выключили &Integrated debugging (Tools->Debugging >Options) ?
У меня сняты все галки в Compiler->Debugging так что Integrated не при чем. Впрочем ради интереса попробовал - не влияет абсолютно.


 
Sergey_Masloff   (2004-10-03 01:36) [36]

Только что попробовал:


procedure DoNothing(AHandle : THandle);
begin
 PostMessage(AHandle, WM_MY, 0, 0);
end;


и


finally
 On E: Exception do
   DoNothing(Aoolication.MainForm.Handle);
end;


procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 610
procs[3] - 3625
procs[0] - 609
procs[1] - 620
procs[2] - 625
procs[3] - 3625
procs[0] - 609
procs[1] - 625
procs[2] - 625
procs[3] - 3625


 
GuAV ©   (2004-10-03 01:37) [37]


> Впрочем ради интереса попробовал - не влияет абсолютно.

Разве &Stop on Delphi Exceptions на третьей вкладке не влияет (если вместе с &Integrated debugging включена) ?


 
GuAV ©   (2004-10-03 01:39) [38]


> finally
>  On E: Exception do
>    DoNothing(Aoolication.MainForm.Handle);
> end;

не надо было On E: Exception do, не поднимается же исключение...
зы не знал что в finally тоже on писать можно , ща проверю...


 
Sergey_Masloff   (2004-10-03 01:41) [39]

GuAV ©   (03.10.04 01:37) [37]
Я ж не в IDE запускаю. Нет не влияет.


 
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"



Страницы: 1 2 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.049 c
4-1095880442
Комбинатор
2004-09-22 23:14
2004.10.24
Наколько процесс загружает процессор?


8-1088526424
lota
2004-06-29 20:27
2004.10.24
Азбука Морзе


6-1092653631
banderas
2004-08-16 14:53
2004.10.24
Как подключить сетевой ресурс без лишних вопросов?


8-1085250190
Forelli
2004-05-22 22:23
2004.10.24
Как вставить Flash ролик в Delphi


1-1097172263
dron-s
2004-10-07 22:04
2004.10.24
Изменение фокуса