Текущий архив: 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.56 MB
Время: 0.041 c