Форум: "Основная";
Текущий архив: 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