![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
какие накладные расходы у try except end?
Jolik © (2008-03-28 15:50:00)Господа!
Может ли кто просветить (хотя бы оценочно) насколько функция с try except end медленне функции без нее в случае НЕвозникновения исключения.
Ведь компилятор делает какие-то телодвижения при входе в процедуру если там есть блок try except end? Да и при выходе наверное...
Заранее благодарен!
Сергей М. (2008-04-04 11:30:00) [61]
> В программе должно быть все красиво
У тебя искаженные представления о красоте.
> Не должно быть ничего лишнего
Не пользуйся типами данных с управляемым временем жизни - не будет ничего лишнего.
Но и не хнычь при этом, мол, "pchar не хочу, асм тоже не хочу, хочу длинные строки, че за фигню мне впаривает компайлер")
Тыщ (2008-04-04 11:27:00) [62]clickmaker © (04.04.08 11:23) [39]
Как раз таки я и пытаюсь жонглировать паскалевскими строками, а не нуль-терминированными.
Использую встроенный в Windows менеджер памяти (HeapAlloc, HeapFree), он не вызывает исключения, если его специально не просить.
clickmaker (2008-04-04 11:23:00) [63]
> [35] Тыщ (04.04.08 11:07)
уверен, что жонглирование нуль-терминированными строками, с постоянным перераспределением памяти компенсирует избавление от исключений?
готов написать свой более оптимальный менеджер памяти, чем борландовый?
Тыщ (2008-04-04 11:23:00) [64]Сергей М. © (04.04.08 11:19) [38]
В программе должно быть все красиво - и размер, и скорость, и структура, внешняя и внутренняя.
Не должно быть ничего лишнего.
Если программирование искусством считать, конечно.
А для себя я считаю именно так.
Сергей М. (2008-04-04 11:19:00) [65]Ты объясни, на чем ты хочешь сэкономить, избавившись от сабжа ?
На размере исп.модуля ?
На локальной/сквозной производительности приложения ?
Сергей М. (2008-04-04 11:15:00) [66]Нелогично другое - стремление к блохоловству, аргументированное лишь ничего не значащим "пишу на чистом ВинАПИ"
Сергей М. (2008-04-04 11:13:00) [67]Отвечаю - не пользовать конструкции вида [28].
Тыщ (2008-04-04 11:07:00) [68]Сергей М. © (04.04.08 11:03) [34]
> И чем он тебе помешал ?
Давайте все-таки отвечать на заданный вопрос - "как избавиться от блока обработки исключений", а не такой вопрос - "чем тебе мешает X?"
Если бы он мне не мешал, я бы не задавал свой вопрос, логично?
Сергей М. (2008-04-04 11:03:00) [69]
> в главном begin end. все равно будет
И чем он тебе помешал ?
Этот блок "охватит" всюработу приложения, один раз за всю его жизнь, что никак не отразится на сквозной его производительности.
Сергей М. (2008-04-04 10:58:00) [70]см. [30]
Тыщ (2008-04-04 10:58:00) [71]Сергей М. © (04.04.08 10:56) [30]
Ну да, в функцииTForm1.Button2Clickне будет этого блока, а в главномbegin end.все равно будет.
Сергей М. (2008-04-04 10:56:00) [72]var
s: string;
procedure TForm1.Button2Click(Sender: TObject);
begin
s := '%PATH%';
end;
Удивись - никаких блоков компилятор не сгенерировал.
Тыщ (2008-04-04 10:56:00) [73]Сергей М. © (04.04.08 10:54) [29]
Приведите пример, пожалуйста.
Сергей М. (2008-04-04 10:54:00) [74]
> виновата строка с var
Далеко не всегда.
> В обоих случаях будет генерироваться этот блок
Вовсе не факт.
Тыщ (2008-04-04 10:43:00) [75]Сергей М. © (04.04.08 10:28) [27]
Нет, виновата строка с var:
var s:string;
begin
end.
Даже тут генерируется этот блок...
Спасибо за объяснение.
Итак, строку можно вернуть либо функцией, либо процедурой с var string.
В обоих случаях будет генерироваться этот блок.
Есть ли еще способы вернуть строку (AnsiString)?
Сергей М. (2008-04-04 10:28:00) [76]
> Смотрю в самое начало кода и вижу mov fs:[eax],esp . Кто
> врет?
ты, разумеется)
Этот блок появился по факту присутствия строчки
s:='%PATH%'
но отнюдь не строчки
ExpandEnvironmentStrings2(s);
которую можно смело закомментировать, чтобы убедиться в том, что блок не исчез.
> в каких еще случаях генерируется этот блок?
Во всех случаях когда компилятор берет на себя ответственность за безусловное освобождение ресурсов, распределенных под данные с управляемым временем жизни, при потенциальной возможности исключений.
Тыщ (2008-04-04 10:19:00) [77]Сергей М. © (04.04.08 10:10) [25]
>> У меня заключил
> Врешь и не моргаешь)
Смотрю в самое начало кода и вижуmov fs:[eax],esp. Кто врет?
> Или не понимаешь в принципе, какому конкретно программному действию этот блок соответствует.
Случай,
> если возвращаемое значение есть LargeString
мы убрали, в каких еще случаях генерируется этот блок?
Не затруднит рассказать или хотя бы дать ссылку?
Сергей М. (2008-04-04 10:10:00) [78]
> У меня заключил
Врешь и не моргаешь)
Или не понимаешь в принципе, какому конкретно программному действию этот блок соответствует.
Тыщ (2008-04-04 10:06:00) [79]Сергей М. © (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 09:56:00) [80]
> О чем и говорилось в [5]
В [5] не было конкретностей, они появились в [6].
А вот теперь измени декларацию своей ф-ции на следующую процедуру:
procedure ExpandEnvironmentStrings2(var s:string);
Удивись - компилятор не заключил вызов процедуры в try-блок !
Теперь думай над происходящим)