Конференция "Основная" » какие накладные расходы у try except end?
 
  • Jolik © (28.03.08 15:50) [0]
    Господа!

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

    Заранее благодарен!
  • Kolan © (28.03.08 15:51) [1]
    CPU Window посмотри и ответь себе сам.
  • Сергей М. © (28.03.08 15:59) [2]

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


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

    Если это критично, то ты либо должен быть асом либо авантюристом)
  • Thrasher © (28.03.08 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 © (28.03.08 17:13) [4]
    Исчерпывающе.
    Спасибо!
  • Тыщ (04.04.08 09:10) [5]
    Кстати, может, кто-нибудь знает, почему в функции и процедуры, содержащие работу со строками, автоматически добавляется обработка исключений, и как этого избежать (ну, кроме переписывания кода на ассемблере)?
  • Тыщ (04.04.08 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.

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

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


    С чего ты взял ?
  • Тыщ (04.04.08 09:17) [8]
    Сергей М. ©   (04.04.08 9:14) [7]

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

    Дизассемблер показывает.
  • Сергей М. © (04.04.08 09:22) [9]

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


    Ну если возвращаемое значение есть LargeString, то это вполне объяснимо - это тип данных с управляемым временем жизни.
  • Тыщ (04.04.08 09:28) [10]
    Сергей М. ©   (04.04.08 9:22) [9]

    Ну так эта обработка и висит мертвым грузом. Управляемое время жизни тут причем? Оно управляется LStrFromPCharLen и LStrClr в моем случае, в них обработки исключений никакой нет.
  • Тыщ (04.04.08 09:30) [11]
    Если вырезать обработку исключений ручками, то код работает так же.
    Вопрос в том, как это убрать во время компиляции.
  • Сергей М. © (04.04.08 09:31) [12]

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


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


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


    А ты спровоцируй искл.ситуацию при исполнении этой ф-ции и посмотри, куда уходит обработка исключнения и что реально полезного она при этом делает !
  • Тыщ (04.04.08 09:35) [13]
    Сергей М. ©   (04.04.08 9:31) [12]

    Это-то понятно, но я пишу на чистом WinAPI без обработки исключений, где надо, там сам обработку поставлю, а тут самодеятельность компилятора только раздражает.
  • Сергей М. © (04.04.08 09:39) [14]

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


    Ну так и пиши без использования типов с управляемым временем жизни, в чем проблема-то ?)
  • Тыщ (04.04.08 09:41) [15]
    Сергей М. ©   (04.04.08 9:39) [14]

    Без строк, с pchar'ами плохо и неудобно :(
  • Сергей М. © (04.04.08 09:42) [16]

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


    Тогда забудь про "чистый WinAPI", в чем проблема-то ?)
  • Тыщ (04.04.08 09:42) [17]
    Может, можно как-нибудь обмануть компилятор, чтобы не добавлял обработку исключений?
  • Сергей М. © (04.04.08 09:45) [18]
    Не надо его обманывать, он все равно умнее тебя)
  • Тыщ (04.04.08 09:47) [19]
    Сергей М. ©   (04.04.08 9:45) [18]

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

    С чего это?
 
Конференция "Основная" » какие накладные расходы у try except end?
Есть новые Нет новых   [134484   +49][b:0][p:0.001]