procedure Delay; var i: integer; s: extended; begin try s := sin(1); except ShowMessage('WTF?'); // ShowMessage('W T F ?'); Halt; end; end;
begin T := GetTickCount; while T = GetTickCount do; T := GetTickCount; for i := 0 to 9999999 do Delay; i := GetTickCount - T; WriteLn(i); ReadLn; end.
Все проверки убрал, отладчик выключил, оптимизацию включил. В таком виде у меня выводит 2534-2544 Однако, если раскомментировать строчку со вторым сообщением, то он вдруг выводит 2834-2854. Если добавить туда ещё строчку ShowMessage('W T F ?'), то он выведет 2613 Откуда берётся такая разница? И как вообще устроен этот блок на самом деле?
Кстати, это все компилируется в Debug-е или в Release? Что, если ВООБЩЕ убрать блок try/except - это даст прирост скорости на твоем компиляторе? Я попробовал у себя добавить десяток строк ShowMessage('всякая фигня') - время выполнения нисколько не увеличилось.
Это компилируется на дельфе-семёрке, все проверки выключены, отладка выключена, отладчик тоже, оптимизация включена. Я и ctrl+alt+c нажимал, ничего такого необычного (по данной теме) не обнаружил. С одним показом сообщения и с 3 скорость примерно одна, а с двумя - другая. Я подобрал именно такие два сообщения, которые наиболее замедляют выполнение. Странно даже, что с 3 сообщениями это делается быстрее, чем с 2мя. Если убрать часть except, будет 2601. Если убрать try, оставив синус, будет 2353, ну это может из-за того, что try совершает заменяет указатель на обработчик исключений, это требует немного времени.
С одним показом сообщения и с 3 скорость примерно одна, а с двумя - другая.
Да нет там показа, вот в чем проблема... Не было исключения - блок except проигнорировался... Если б был показ - то твоя программа тут же завершилась бы, ибо Halt находится там же...
Кстати, проверил этот же код в FPC (заменив ShowMessage на Writeln)... Мало того, что абсолютно одинаковое поведение (время нисколько не увеличивается вне зависимости от числа "выводимых" строк), так еще и время одно и то же. Что там что тут: 410
procedure Delay; var s: extended; begin try s := sin(1); except on E: Exception do // Это может оказаться необходимым... begin ShowMessage('WTF?'); ShowMessage('W T F ?'); Halt; end; end; end;
var T: cardinal; i: integer; begin T := GetTickCount; while T = GetTickCount do;
T := GetTickCount; for i := 0 to 9999999 do Delay; i := GetTickCount - T; WriteLn(i); ReadLn; end.