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

Вниз

какие накладные расходы у try except end?   Найти похожие ветки 

 
Jolik ©   (2008-03-28 15:50) [0]

Господа!

Может ли кто просветить (хотя бы оценочно) насколько функция с try except end медленне функции без нее в случае НЕвозникновения исключения.
Ведь компилятор делает какие-то телодвижения при входе в процедуру если там есть блок try except end? Да и при выходе наверное...

Заранее благодарен!


 
Kolan ©   (2008-03-28 15:51) [1]

CPU Window посмотри и ответь себе сам.


 
Сергей М. ©   (2008-03-28 15:59) [2]


> компилятор делает какие-то телодвижения при входе в процедуру
> если там есть блок try except end? Да и при выходе наверное


Угу.
И совсем небольшие. Если, конечно же, не учитывать соотв.телодвижения системы.

Если это критично, то ты либо должен быть асом либо авантюристом)


 
Thrasher ©   (2008-03-28 16:59) [3]

Разница всего в парочку ассемблерных инструкций.

xor eax,eax  //только когда есть try, except
push ebp
push Adddr //только когда есть try, except
push dword ptr fs:[eax] //только когда есть try, except
mov fs:[eax],esp //только когда есть try, except

//текст процедурі, где может возникнуть исключение

mov fs:[eax],edx //только когда есть try, except
jmp +$A //только когда есть try, except
Addr:
jmp Exception //только когда есть try, except

Call DoneExcept //только когда есть try, except



Потом вычисляем сколько тактов заберут инструкции. И узнаем сколько "лишнего" времени съел процессор.


 
Jolik ©   (2008-03-28 17:13) [4]

Исчерпывающе.
Спасибо!


 
Тыщ   (2008-04-04 09:10) [5]

Кстати, может, кто-нибудь знает, почему в функции и процедуры, содержащие работу со строками, автоматически добавляется обработка исключений, и как этого избежать (ну, кроме переписывания кода на ассемблере)?


 
Тыщ   (2008-04-04 09:14) [6]

Прошу прощения, не содержащие, а вызывающие другие функции, возвращающие строку.

Пример:
function ExpandEnvironmentStrings2(const s:string):string;
var Buffer:pchar;
   Size:cardinal;
begin
 Size:=ExpandEnvironmentStrings(pchar(s),nil,0);
 GetMem(Buffer,Size);
 Size:=ExpandEnvironmentStrings(pchar(s),Buffer,Size);
 SetString(Result,Buffer,Size-1);
 FreeMem(Buffer);
end;

begin
 // Тут как будто есть блок try..except..end
 ExpandEnvironmentStrings2("%PATH%");
end.


 
Сергей М. ©   (2008-04-04 09:14) [7]


> почему в функции и процедуры, содержащие работу со строками,
>  автоматически добавляется обработка исключений


С чего ты взял ?


 
Тыщ   (2008-04-04 09:17) [8]

Сергей М. ©   (04.04.08 9:14) [7]

> С чего ты взял ?

Дизассемблер показывает.


 
Сергей М. ©   (2008-04-04 09:22) [9]


> Тыщ   (04.04.08 09:17) [8]


Ну если возвращаемое значение есть LargeString, то это вполне объяснимо - это тип данных с управляемым временем жизни.


 
Тыщ   (2008-04-04 09:28) [10]

Сергей М. ©   (04.04.08 9:22) [9]

Ну так эта обработка и висит мертвым грузом. Управляемое время жизни тут причем? Оно управляется LStrFromPCharLen и LStrClr в моем случае, в них обработки исключений никакой нет.


 
Тыщ   (2008-04-04 09:30) [11]

Если вырезать обработку исключений ручками, то код работает так же.
Вопрос в том, как это убрать во время компиляции.


 
Сергей М. ©   (2008-04-04 09:31) [12]


> эта обработка и висит мертвым грузом


Угу, висит.
До тех пор пока дело не закончится исключением.


> Управляемое время жизни тут причем?


А ты спровоцируй искл.ситуацию при исполнении этой ф-ции и посмотри, куда уходит обработка исключнения и что реально полезного она при этом делает !


 
Тыщ   (2008-04-04 09:35) [13]

Сергей М. ©   (04.04.08 9:31) [12]

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


 
Сергей М. ©   (2008-04-04 09:39) [14]


> пишу на чистом WinAPI без обработки исключений
> самодеятельность компилятора только раздражает


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


 
Тыщ   (2008-04-04 09:41) [15]

Сергей М. ©   (04.04.08 9:39) [14]

Без строк, с pchar"ами плохо и неудобно :(


 
Сергей М. ©   (2008-04-04 09:42) [16]


> плохо и неудобно


Тогда забудь про "чистый WinAPI", в чем проблема-то ?)


 
Тыщ   (2008-04-04 09:42) [17]

Может, можно как-нибудь обмануть компилятор, чтобы не добавлял обработку исключений?


 
Сергей М. ©   (2008-04-04 09:45) [18]

Не надо его обманывать, он все равно умнее тебя)


 
Тыщ   (2008-04-04 09:47) [19]

Сергей М. ©   (04.04.08 9:45) [18]

> он все равно умнее тебя)

С чего это?


 
Сергей М. ©   (2008-04-04 09:48) [20]

Впрочем, если геморрой на собственный зад тебя не страшит, готовь данные и вызывай функции с использованием basm, тогда компилятор махнет на твои извращения рукой)


 
Сергей М. ©   (2008-04-04 09:49) [21]


> С чего это?


Он мне по секрету на ушко шепнул)


 
Тыщ   (2008-04-04 09:51) [22]

Сергей М. ©   (04.04.08 9:48) [20]

О чем и говорилось в [5]:
> кроме переписывания кода на ассемблере

Сергей М. ©   (04.04.08 9:49) [21]

Ну-ну...


 
Сергей М. ©   (2008-04-04 09:56) [23]


> О чем и говорилось в [5]


В [5] не было конкретностей, они появились в [6].

А вот теперь измени декларацию своей ф-ции на следующую процедуру:

procedure ExpandEnvironmentStrings2(var s:string);


Удивись - компилятор не заключил вызов процедуры в try-блок !

Теперь думай над происходящим)


 
Тыщ   (2008-04-04 10:06) [24]

Сергей М. ©   (04.04.08 9:56) [23]

Честно удивлюсь, если не заключил. У меня заключил.

Код:
uses Windows;
{$APPTYPE CONSOLE}
procedure ExpandEnvironmentStrings2(var s:string);
var Buffer:pchar;
   Size:cardinal;
begin
 Size:=ExpandEnvironmentStrings(pchar(s),nil,0);
 GetMem(Buffer,Size);
 Size:=ExpandEnvironmentStrings(pchar(s),Buffer,Size);
 SetString(s,Buffer,Size-1);
 FreeMem(Buffer);
end;

procedure Write_(var s:string);
var Temp:dword;
begin
 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),s[1],Length(s),Temp,nil);
end;

var
 s:string;
begin
 s:="%PATH%";
 ExpandEnvironmentStrings2(s);
 Write_(s);
end.


 
Сергей М. ©   (2008-04-04 10:10) [25]


> У меня заключил


Врешь и не моргаешь)
Или не понимаешь в принципе, какому конкретно программному действию этот блок соответствует.


 
Тыщ   (2008-04-04 10:19) [26]

Сергей М. ©   (04.04.08 10:10) [25]

>> У меня заключил
> Врешь и не моргаешь)

Смотрю в самое начало кода и вижу mov fs:[eax],esp . Кто врет?

> Или не понимаешь в принципе, какому конкретно программному действию этот блок соответствует.

Случай,
> если возвращаемое значение есть LargeString
мы убрали, в каких еще случаях генерируется этот блок?
Не затруднит рассказать или хотя бы дать ссылку?


 
Сергей М. ©   (2008-04-04 10:28) [27]


> Смотрю в самое начало кода и вижу mov fs:[eax],esp . Кто
> врет?


ты, разумеется)

Этот блок появился по факту присутствия строчки

s:="%PATH%"

но отнюдь не строчки

ExpandEnvironmentStrings2(s);

которую можно смело закомментировать, чтобы убедиться в том, что блок не исчез.


> в каких еще случаях генерируется этот блок?


Во всех случаях когда компилятор берет на себя ответственность за безусловное освобождение ресурсов, распределенных под данные с управляемым временем жизни, при потенциальной возможности исключений.


 
Тыщ   (2008-04-04 10:43) [28]

Сергей М. ©   (04.04.08 10:28) [27]

Нет, виновата строка с var:

var s:string;
begin
end.


Даже тут генерируется этот блок...

Спасибо за объяснение.

Итак, строку можно вернуть либо функцией, либо процедурой с var string.
В обоих случаях будет генерироваться этот блок.

Есть ли еще способы вернуть строку (AnsiString)?


 
Сергей М. ©   (2008-04-04 10:54) [29]


> виновата строка с var


Далеко не всегда.


> В обоих случаях будет генерироваться этот блок


Вовсе не факт.


 
Сергей М. ©   (2008-04-04 10:56) [30]

var
 s: string;

procedure TForm1.Button2Click(Sender: TObject);
begin
 s := "%PATH%";
end;

Удивись - никаких блоков компилятор не сгенерировал.


 
Тыщ   (2008-04-04 10:56) [31]

Сергей М. ©   (04.04.08 10:54) [29]

Приведите пример, пожалуйста.


 
Сергей М. ©   (2008-04-04 10:58) [32]

см. [30]


 
Тыщ   (2008-04-04 10:58) [33]

Сергей М. ©   (04.04.08 10:56) [30]

Ну да, в функции TForm1.Button2Click не будет этого блока, а в главном begin end. все равно будет.


 
Сергей М. ©   (2008-04-04 11:03) [34]


> в главном begin end. все равно будет


И чем он тебе помешал ?
Этот блок "охватит" всю работу приложения, один раз за всю его жизнь, что никак не отразится на сквозной его производительности.


 
Тыщ   (2008-04-04 11:07) [35]

Сергей М. ©   (04.04.08 11:03) [34]

> И чем он тебе помешал ?

Давайте все-таки отвечать на заданный вопрос - "как избавиться от блока обработки исключений", а не такой вопрос - "чем тебе мешает X?"
Если бы он мне не мешал, я бы не задавал свой вопрос, логично?


 
Сергей М. ©   (2008-04-04 11:13) [36]

Отвечаю - не пользовать конструкции вида [28].


 
Сергей М. ©   (2008-04-04 11:15) [37]

Нелогично другое - стремление к блохоловству, аргументированное лишь ничего не значащим "пишу на чистом ВинАПИ"


 
Сергей М. ©   (2008-04-04 11:19) [38]

Ты объясни, на чем ты хочешь сэкономить, избавившись от сабжа ?
На размере исп.модуля ?
На локальной/сквозной производительности приложения ?


 
clickmaker ©   (2008-04-04 11:23) [39]


> [35] Тыщ   (04.04.08 11:07)

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


 
Тыщ   (2008-04-04 11:23) [40]

Сергей М. ©   (04.04.08 11:19) [38]

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



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

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

Наверх




Память: 0.56 MB
Время: 0.013 c
2-1229507774
lod
2008-12-17 12:56
2009.02.01
Версия программы


2-1229498873
programmer90
2008-12-17 10:27
2009.02.01
Деревья


2-1229403281
Съедобный
2008-12-16 07:54
2009.02.01
добавление записи в БД


2-1229435530
nonamez11
2008-12-16 16:52
2009.02.01
поиск в строке


2-1229523838
Ru
2008-12-17 17:23
2009.02.01
Напомните по WinAPI