Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

какие накладные расходы у try except end?


Страницы:   1 2 3 4 5 6

Jolik ©   (2008-03-28 15:50:00) 

Господа!

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

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


Тыщ   (2008-04-08 17:17:00) [1]

oxffff ©   (07.04.08 21:15) [101]

А, ну да, s^:=''сделает вызов LStrClrнапрямую.


oxffff   (2008-04-07 21:15:00) [2]


> Сергей М,   (07.04.08 21:10) [100]
>
> > Кто? Где?
>
>
> Опоздал)
> Ордена Сутулова уже раздали)


А зачем
procedure LStrClr(S:PAnsiString);
asm
jmp System.@LStrClr
end;

LStrClr(s);

Что S^:='' не поможет в случае гарантированной инициализации S? :)


Сергей М,   (2008-04-07 21:10:00) [3]


> Кто? Где?


Опоздал)
Ордена Сутулова уже раздали)


oxffff   (2008-04-07 21:06:00) [4]


> Тыщ   (04.04.08 14:58) [84]
> Во, обработку исключений победил!


Кто? Где?


Сергей М,   (2008-04-07 20:44:00) [5]


> Mystic ©   (07.04.08 18:24) [97]


Красота требует жертв)
Автору все это фиолетово - главное чтобы было  "красиво")


Mystic   (2008-04-07 18:24:00) [6]

> Во, обработку исключений победил!

При работе со строками большую часть ресурсов заберет не несколько ассемблерных инструкций + 12 байт стека + обращение к TEB, а использование динамической памяти. И победа далась тебе дорогой ценой: вставлено несколько дополнительных вызовов CALL и JMP. Можешь сравнить эти два фрагмента по скорости ;)


Тыщ   (2008-04-05 11:39:00) [7]

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

> например, некая твоя логическая ошибка привела к загаживанию управляющих стуктур менеджера памяти

Да уж, это надо постараться...

> Для какой-нить главбухши, знающий только "дебеты-кредиты-сальды-сторны" - самое то)

Для "какой-нить главбухши" я не пишу... пока что.


Сергей М.   (2008-04-04 16:10:00) [8]


> По какой же еще?


Ну, например, некая твоя логическая ошибка привела к загаживанию управляющих стуктур менеджера памяти.

Да мало ли в бразилии Педро !)


> получим стандартное и вполне приличное


Очень прилично, нечего сказать)
Для какой-нить главбухши, знающий только "дебеты-кредиты-сальды-сторны" - самое то)


Тыщ   (2008-04-04 15:58:00) [9]

Сергей М. ©   (04.04.08 15:48) [93]

> с чего ты взял, что операция аллокации может вызвать искл-е только по этой причине ?)

По какой же еще?

> программа после запуска тут же тихо умирает

Так получается именно из-за "насильной" вставки обработки исключений, от которой и так мало что осталось.
Если ее нет совсем, то получим стандартное и вполне приличное

The instruction at "0x00401080" referenced memory at "0x00000000". The memory could not be "read".

Click on OK to terminate the program
Click on CANCEL to debug the program


Сергей М.   (2008-04-04 15:48:00) [10]


> Если системе будет настолько нехватать памяти


А с чего ты взял, что операция аллокации может вызвать искл-е только по этой причине ?)


> SEH на каждый чих - мусор


Зачем на каждый ?
Вовсе не обязательно)

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

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


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

Сергей М. ©   (04.04.08 15:36) [90]

SEH на каждый чих - мусор, вот :)


Тыщ   (2008-04-04 15:39:00) [12]

Сергей М. ©   (04.04.08 15:34) [89]

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


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


> Дети Ивана Кулибина


Да уж ...
SEH для них - просто ненужный мусор)


Сергей М.   (2008-04-04 15:34:00) [14]


> Ничего, с pchar'ами не лучше


Угу.
Лучше, наверно, нарваться на исключение и игнорировать этот факт (как и саму обработку), пребывая в святой уверенности, что операция прошла успешно)


> 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); //в buffer'е мусор, это спровоцирует иск.ситуацию
>  SetString(s,Buffer,Size-1); //даже если GetMem выполнена успешно, аллокация памяти под строку и копирование туда данных из буфера тоже может завершиться неуспехом ?
>  FreeMem(Buffer); //если в buffer'е не мусор, то произойдет утечка памяти, поскольку при обработке искл-я у тебя происходит банальный выход по RETN
> end;
>


Игорь Шевченко   (2008-04-04 15:10:00) [15]

Дети Ивана Кулибина.


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

Ничего, с pchar'ами не лучше.


Сергей М.   (2008-04-04 15:05:00) [17]

Если такого "красивого" исх.кода будет эдак мегабайт на 10..20 и там вкрадется лог.ошибка, тот, кто будет вынужденно изучать твой код с целью исправления этой ошибки, обязательно поймайт и поколотит тебя)

А ошибка там обязательнобудет)


Сергей М.   (2008-04-04 15:01:00) [18]


> @HandleFinally там есть.


Согласен, есть.

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


Тыщ   (2008-04-04 14:58:00) [19]

Во, обработку исключений победил!

uses Windows;
{$APPTYPE CONSOLE}

procedure LStrFromPCharLen(Dest: PAnsiString; Source: PAnsiChar; Length: Integer);
asm
 jmp System.@LStrFromPCharLen
end;

procedure LStrClr(S:PAnsiString);
asm
 jmp System.@LStrClr
end;

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:pstring;
 s_holder:integer;
begin
 s:=@s_holder;
 LStrFromPCharLen(s,'%PATH%',6);
 ExpandEnvironmentStrings2(s^);
 Write_(s^);
 LStrClr(s);
end.


Тыщ   (2008-04-04 14:51:00) [20]

Сергей М. ©   (04.04.08 14:41) [82]

> в map'е процедурой идентификатором _HandleFinally даже не пахнет.

@HandleFinally там есть.


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо