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

Вниз

какие накладные расходы у 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.007 c
15-1228677835
DillerXX
2008-12-07 22:23
2009.02.01
Кварцевая лампа и обгоание мебели


2-1229500831
Дмитрий
2008-12-17 11:00
2009.02.01
Hide Form Icon


6-1197549758
mary
2007-12-13 15:42
2009.02.01
idtcpclient


2-1229451089
Nyashka
2008-12-16 21:11
2009.02.01
Паскальчик.


15-1228473709
GanibalLector
2008-12-05 13:41
2009.02.01
работа с девайсом по GPRS. Как ???





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