Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

Множество 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.04 c
1-1097579697
DesWind
2004-10-12 15:14
2004.10.24
Аппроксимация


1-1097473180
Dr. Genius
2004-10-11 09:39
2004.10.24
Какой сегодня день недели?


4-1095880392
BKGG
2004-09-22 23:13
2004.10.24
Как узнать имя класса окна.


1-1097563355
Ann_k
2004-10-12 10:42
2004.10.24
Процедуры в datamodule


1-1097139093
Cosinus
2004-10-07 12:51
2004.10.24
Координаты вывода сообщения по ShowMessageCj,





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский