Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 06:03
Оценка: 35 (9)
Навеяно, например, Re: пример из книги: цикл + try/catch
Автор: Clevelus
Дата: 13.07.08
. Не буду затрагивать высокоуровневые вещи, флейм vc коды возврата, и TR 18015.

Рассмотрим 2 примера для самого плохого случая из промышленных компиляторов — MSVC x86 (32bit).

void foo(const string&);

void test_eh1(const vector<string> & v)
{
  try
  {
    for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
      foo(*i);
  }
  catch(...)
  {
    __asm int 3
  }
}

void test_eh2(const vector<string> & v)
{
  for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
  {
    try
    {
      foo(*i);
    }
    catch(...)
    {
      __asm int 3
    }
  }
}


Вот что создаёт компилятор, инструкции для поддержки C++ EH выделены:

_TEXT   SEGMENT
__$EHRec$ = -16                     ; size = 16
_v$ = 8                         ; size = 4
?test_eh1@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z PROC ; test_eh1, COMDAT

; 62   : {

    push    ebp
    mov ebp, esp
    push    -1 ; состояние для обработчика SEH
    ;; установка SEH фрейма OS - регистрируется обработчик понимающий C++ исключения 
    push    __ehhandler$?test_eh1@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z
    mov eax, DWORD PTR fs:0
    push    eax
    mov DWORD PTR fs:0, esp
    push    ecx
    push    ebx
    push    esi
    push    edi

; 63   :   try
; 64   :   {
; 65   :     for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )

    mov edi, DWORD PTR _v$[ebp]
    mov esi, DWORD PTR [edi]
    mov DWORD PTR __$EHRec$[ebp], esp
    mov DWORD PTR __$EHRec$[ebp+12], 0 ; состояние для обработчика SEH
    npad    5
$LL3@test_eh1:
    cmp esi, DWORD PTR [edi+4]
    je  SHORT $LN10@test_eh1

; 66   :       foo(*i);

    push    esi
    call    ?foo@@YGXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z ; foo
    add esi, 16                 ; 00000010H
    jmp SHORT $LL3@test_eh1
__catch$?test_eh1@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z$0:

; 67   :   }
; 68   :   catch(...)
; 69   :   {
; 70   :     __asm int 3

    int 3

; 71   :   }

    mov eax, $LN10@test_eh1
    ret 0
$LN10@test_eh1:

; 72   : }

    mov ecx, DWORD PTR __$EHRec$[ebp+4] ;; снатие SEH frame 
    pop edi
    pop esi
    mov DWORD PTR fs:0, ecx             ;;
    pop ebx
    mov esp, ebp
    pop ebp
    ret 4
_TEXT   ENDS


_TEXT   SEGMENT
_i$21988 = -20                      ; size = 4
__$EHRec$ = -16                     ; size = 16
_v$ = 8                         ; size = 4
?test_eh2@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z PROC ; test_eh2, COMDAT

; 75   : {

    push    ebp
    mov ebp, esp
    push    -1
    push    __ehhandler$?test_eh2@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z
    mov eax, DWORD PTR fs:0
    push    eax
    mov DWORD PTR fs:0, esp
    sub esp, 8

; 76   :   for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )

    mov eax, DWORD PTR _v$[ebp]
    push    ebx
    push    esi
    mov esi, DWORD PTR [eax]
    push    edi
    mov DWORD PTR __$EHRec$[ebp], esp
$LN23@test_eh2:
    mov ecx, DWORD PTR _v$[ebp]
    mov DWORD PTR _i$21988[ebp], esi
    cmp esi, DWORD PTR [ecx+4]
    je  SHORT $LN2@test_eh2

; 77   :   {
; 78   :     try
; 79   :     {
; 80   :       foo(*i);

    push    esi
    mov DWORD PTR __$EHRec$[ebp+12], 0
    call    ?foo@@YGXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z ; foo
    mov DWORD PTR __$EHRec$[ebp+12], -1

; 76   :   for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )

    add esi, 16                 ; 00000010H
    jmp SHORT $LN23@test_eh2
__catch$?test_eh2@@YGXABV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@Z$0:

; 81   :     }
; 82   :     catch(...)
; 83   :     {
; 84   :       __asm int 3

    int 3

; 85   :     }

    mov DWORD PTR __$EHRec$[ebp+12], -1
    mov eax, $LN21@test_eh2
    ret 0
$LN21@test_eh2:
    mov esi, DWORD PTR _i$21988[ebp]
    add esi, 16                 ; 00000010H
    jmp SHORT $LN23@test_eh2
$LN2@test_eh2:

; 86   :   }
; 87   : }

    mov ecx, DWORD PTR __$EHRec$[ebp+4]
    pop edi
    pop esi
    mov DWORD PTR fs:0, ecx
    pop ebx
    mov esp, ebp
    pop ebp
    ret 4
_TEXT   ENDS


Если откинуть мусор, останется соль — команды вида
mov DWORD PTR __$EHRec$[ebp+12], 0
mov DWORD PTR __$EHRec$[ebp+12], -1

Это неявно вводимая компилятором переменная (типа ehstate) — состояние, по которому, в случае выброса исключения, обработчик определит, где оно произошло. "Оверхед" от этих команд очень мал по сравнению, например, с вызовом функции — на скорости цикла не скажется.

SEH фрейм регистрируется один раз — в прологе и снимается один раз — в эпилоге функции. В этом примере не видно, но можете проверять сами — картина останется неизменной независимо от количества вложенных try catch блоков. Будет лишь меняться значение ehstate — по сути, уровень вложенности. Если интересно, как работает обработчик, можно почитать статью Matt Pitreck в MSDN (есть перевод на wasm.ru) об обработке обычных (SEH) исключений компилятором MSVC. C++ EH работает примерно так же, только структура на стеке чуть меньше

Из принципиальных отличий от кода без исключений, я бы выделил невозможность инлайна:
1. дестракторов объектов из try блока;
2. самих функций с try блоком.
но тут еще вопрос, является ли это оверхедом, учитывая, что функция вызывается более одного раза...


Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Правда об оверхеде исключений.
От: Were  
Дата: 14.07.08 08:09
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.


Особенно упертых даже этим не убедишь )
Re: Правда об оверхеде исключений.
От: Максим2006 Беларусь  
Дата: 14.07.08 08:55
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Навеяно, например, Re: пример из книги: цикл + try/catch
Автор: Clevelus
Дата: 13.07.08
. Не буду затрагивать высокоуровневые вещи, флейм vc коды возврата, и TR 18015.


[skip]

GN>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.


Не сдержался?
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 09:47
Оценка:
Здравствуйте, Were,

Например, я — сверхупёртый Поэтому, если что-то расходится с моими взглядами (а если я что-то не знаю, то любая информация расходится), стараюсь проверить сам.

Предыстория поста: прочитал в MSDN, что C++ EH (стало быть и вообще C++ в общем случае) невозможно в ядре Windows. Одна из причин — огромный оверхед. Разобрался — на самом деле потому, что рантайм хранит немного хлама в TLS, которых в ядре нет, реализовал без него
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 09:53
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Не сдержался?


Когда-то, в MSDN я читал в основном только первую половину описания функций — о параметрах. Потом заметил, что в какой-то вполне повседневной, в ремарках написано о необходимости __try.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Правда об оверхеде исключений.
От: merk Россия  
Дата: 14.07.08 10:19
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Навеяно, например, Re: пример из книги: цикл + try/catch
Автор: Clevelus
Дата: 13.07.08
. Не буду затрагивать высокоуровневые вещи, флейм vc коды возврата, и TR 18015.


GN>Рассмотрим 2 примера для самого плохого случая из промышленных компиляторов — MSVC x86 (32bit).


GN>
GN>void foo(const string&);

GN>void test_eh1(const vector<string> & v)
GN>{
GN>  try
GN>  {
GN>    for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
GN>      foo(*i);
GN>  }
GN>  catch(...)
GN>  {
GN>    __asm int 3
GN>  }
GN>}

GN>void test_eh2(const vector<string> & v)
GN>{
GN>  for ( vector<string>::const_iterator i = v.cbegin(); i != v.cend(); ++i )
GN>  {
GN>    try
GN>    {
GN>      foo(*i);
GN>    }
GN>    catch(...)
GN>    {
GN>      __asm int 3
GN>    }
GN>  }
GN>}
GN>



пример не очень показательный.
вы перехватываете все исключения, и замусорили код итераторами, не относящимися к вопросу исключений вообще.

сделайте так
есть функция, что кидает 2 разных исключения
вызиывется в простом цикле.
после цикла есть обработчик одного и другого исключения.

типа псевдокод.


extern void f(int fx); //генерит исключение 1 и 2

int test()
{
  int x=0;
  try 
  {
    while (x<100)
    {
       f(x); x++;
    }
   }
   catch( исключение 1) {return 1; };
   catch( исключение 2) {return 2; };
   return 0;
}
Re[3]: Правда об оверхеде исключений.
От: Максим2006 Беларусь  
Дата: 14.07.08 10:45
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Максим2006, Вы писали:


М>>Не сдержался?


GN>Когда-то, в MSDN я читал в основном только первую половину описания функций — о параметрах. Потом заметил, что в какой-то вполне повседневной, в ремарках написано о необходимости __try.


Напиши, плиз, в какой, если вспомнишь.
А так, не только ж из-за оверхеда отказываются от исключений (например, в ком) и "писать под Win" — очень уж широкое понятие.
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 10:55
Оценка:
Здравствуйте, merk, Вы писали:

M>пример не очень показательный.


Пример такой, что бы было похоже на пост по ссылке.

M>сделайте так

M>есть функция, что кидает 2 разных исключения
M>вызиывется в простом цикле.
M>после цикла есть обработчик одного и другого исключения.

Вот сам бы сделал, и увидел бы, что количество throw и catch не повлияет на размер лишнего кода (рузумеется, будет добавлен код для каждого catch и по вызову 2х аргументной функции на каждый throw). Хендлер будет всё равно один (он вообще один на всю программу и вызывается через переходники, см. ниже) и искать нужный catch в статической таблице (по типу брошенного объекта).

__ehhandler$?blah-blah:
    mov eax, OFFSET __ehfuncinfo$?blah-blah
    jmp ___CxxFrameHandler3


В простых случаях, с /EHs, компилятор вообще может разрулить все без SEH, на условных переходах.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 11:11
Оценка:
Здравствуйте, Максим2006, Вы писали:

М>Напиши, плиз, в какой, если вспомнишь.


Написал в "какой-то", потому что она не одна. Например, MapViewOfFile.

М>А так, не только ж из-за оверхеда отказываются от исключений (например, в ком) и "писать под Win" — очень уж широкое понятие.


Я мало знаком с COM, вот что нашел:

COM will not propagate a C++ exception from the callee to the caller, even when both the caller and the callee are written in C++. This catches some COM newcomers off guard, but it should be no surprise if you recall that COM is language-independent. COM boundaries are language boundaries. After all, if the caller is written in C and the callee is written in C++, what would COM do with the C++ exception? If your code throws an exception, the caller will see a failure with an HRESULT of 0x80010105 (RPC_E_SERVERFAULT). Interestingly enough, this is the same error the caller sees if the callee attempts an illegal memory access. In both cases, the COM runtime isolates the caller of the object from runtime errors inside the object and presents them as server errors.

Это ведь не запрет, а ограничение?
Кстати, С++ рантайм зачем-то понимает исключение с NTSTATUS 0xE0000000|'MOC' (C++ имеют код 0xE0000000|'msc')
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Правда об оверхеде исключений.
От: varnie  
Дата: 14.07.08 11:29
Оценка:
Здравствуйте, merk, Вы писали:

M>сделайте так

M>есть функция, что кидает 2 разных исключения
M>вызиывется в простом цикле.
M>после цикла есть обработчик одного и другого исключения.

M>типа псевдокод.


подумалось еще вот что -- интересно, а как влияет на быстродействие "вложенность" try/catch?
try{
   try{
    //...code
    //...code
   }catch(const ExceptionKindOne &e){
     //do smth
   }
}catch(const ExceptionKindTwo &e){
  //do smth
}
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re: Правда об оверхеде исключений.
От: Alexander G Украина  
Дата: 14.07.08 11:30
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Рассмотрим 2 примера для самого плохого случая из промышленных компиляторов — MSVC x86 (32bit).


А почему MSVC x86 — самый плохой случай из промышленных компиляторов ?
Русский военный корабль идёт ко дну!
Re[2]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 12:04
Оценка: 4 (1)
Здравствуйте, Alexander G, Вы писали:

AG>А почему MSVC x86 — самый плохой случай из промышленных компиляторов ?


В нём C++ EH реализован поверх SEH OS, генерируются дополнительные машинные команды для инициализации хендлеров (см. пролог функции). ICC для Win32 тоже попадает сюда, т.к. он бинарно совместим. Это разумная плата за возможность ловить и низкоуровневые исключения + возможность трансляции их в C++.

В GCC, если не ошибаюсь, сделано как и в Win64, без оверхеда в рантайме на инициализацию (data approach согласно TR 18015).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: Правда об оверхеде исключений.
От: Максим2006 Беларусь  
Дата: 14.07.08 12:12
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Максим2006, Вы писали:


М>>Напиши, плиз, в какой, если вспомнишь.


GN>Написал в "какой-то", потому что она не одна. Например, MapViewOfFile.

На on-line MSDN для MapViewOfFile нет вроде упоминаний о __try/__catch

М>>А так, не только ж из-за оверхеда отказываются от исключений (например, в ком) и "писать под Win" — очень уж широкое понятие.


GN>Я мало знаком с COM, вот что нашел:

GN>

COM will not propagate a C++ exception from the callee to the caller, even when both the caller and the callee are written in C++. This catches some COM newcomers off guard, but it should be no surprise if you recall that COM is language-independent. COM boundaries are language boundaries. After all, if the caller is written in C and the callee is written in C++, what would COM do with the C++ exception? If your code throws an exception, the caller will see a failure with an HRESULT of 0x80010105 (RPC_E_SERVERFAULT). Interestingly enough, this is the same error the caller sees if the callee attempts an illegal memory access. In both cases, the COM runtime isolates the caller of the object from runtime errors inside the object and presents them as server errors.

GN>Это ведь не запрет, а ограничение?
GN>Кстати, С++ рантайм зачем-то понимает исключение с NTSTATUS 0xE0000000|'MOC' (C++ имеют код 0xE0000000|'msc')

Ага, ограничение, ограничивающее использование исключений поэтому и отказываются
Re[3]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 12:17
Оценка:
Здравствуйте, varnie, Вы писали:

V>подумалось еще вот что -- интересно, а как влияет на быстродействие "вложенность" try/catch?


Практически никак не влияет. Я уже упоминал выше про ehstate — грубо, каждому try присвается свой номер и он сохраняется на входе в блок командами
mov DWORD PTR __$EHRec$[ebp+12], 0

Количество catch влияет на размер данных (по 16 байт на каждый). В рантайме оверхед == 0 — затраты только если возникло исключение.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Правда об оверхеде исключений.
От: Аноним  
Дата: 14.07.08 12:36
Оценка: +1
GN>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.
Вы тут не упомянули самую малость
А конкретно то что бросание исключения это вызов ядра, и последующий callback из ядра user-mode обработчика (ntdll!KiUserExceptionDispatcher) который уже начнет бродить по структурам в TEB'е вызывая обрабочики. И пара тысяч тактов CPU на всю эту мудотень.
Re[3]: Правда об оверхеде исключений.
От: merk Россия  
Дата: 14.07.08 13:09
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, merk, Вы писали:


M>>пример не очень показательный.


GN>Пример такой, что бы было похоже на пост по ссылке.


M>>сделайте так

M>>есть функция, что кидает 2 разных исключения
M>>вызиывется в простом цикле.
M>>после цикла есть обработчик одного и другого исключения.

GN>Вот сам бы сделал, и увидел бы, что количество throw и catch не повлияет на размер лишнего кода (рузумеется, будет добавлен код для каждого catch и по вызову 2х аргументной функции на каждый throw). Хендлер будет всё равно один (он вообще один на всю программу и вызывается через переходники, см. ниже) и искать нужный catch в статической таблице (по типу брошенного объекта).


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

а критиковал я пример только потому, что он не иллюстрирует реальное применение исключений, когда происходит обработка какого-то конкретного исключения, а не ВСЕХ. что есть просто перехват трэпа.
Re[2]: Правда об оверхеде исключений.
От: IID Россия  
Дата: 14.07.08 13:55
Оценка: +2
Здравствуйте, Аноним, Вы писали:

GN>>Вывод такой — не стоит забивать голову ерундой об оверхеде. Нужно быть очень увереннымв себе, что бы писать под Win даже без __try __except, а C++ EH лишнего практически не вносит. Разве что копирование выброшенного объекта, если используется в обработчике (кстати, при ловле по ссылке — будет скопирована "ссылка"). А в x64 битной Win и SEH бесплатен.

А>Вы тут не упомянули самую малость
А>А конкретно то что бросание исключения это вызов ядра, и последующий callback из ядра user-mode обработчика (ntdll!KiUserExceptionDispatcher) который уже начнет бродить по структурам в TEB'е вызывая обрабочики. И пара тысяч тактов CPU на всю эту мудотень.

Дык он разбирал накладные расходы в случае, если исключение не будет брошено. А ежели оно будет брошено — то какая разница где стоит try/catch ? В любом случае будет расход кучи тактов.
kalsarikännit
Re[4]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 15:19
Оценка:
Здравствуйте, merk, Вы писали:

M>честно говоря, я настолько морально устойчив, что не применяю некие прынципы, только исходя из кода, что генерит для них компилятор.


Значит этот пост был адресован другим.

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


В "философии програмирования" я бы охотно согласился, а, например, ISO/IEC составили Technical Report on C++ Performance где Exception Handling посвещен десяток страниц. Там люди штаны просиживают.

M>а критиковал я пример только потому, что он не иллюстрирует реальное применение исключений, когда происходит обработка какого-то конкретного исключения, а не ВСЕХ.


Что бы более-менее раскрыть тему C+ EH в MSVC, нужно минимум статью по объёму как у Pietrek (эх, опесатался выше ) и Jorgon, да 1K+ LOC. Без учета Re: Правда об оверхеде исключений.
Автор:
Дата: 14.07.08
Только чукча не писатель, чукча лесом едет, лес поёт
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Правда об оверхеде исключений.
От: gear nuke  
Дата: 14.07.08 15:19
Оценка:
Здравствуйте, IID, Вы писали:

IID>В любом случае будет расход кучи тактов.


А главное, что это будет в исключительной ситуации

P.S. ты куда пропал
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Правда об оверхеде исключений.
От: remark Россия http://www.1024cores.net/
Дата: 14.07.08 19:20
Оценка: 9 (1) :))
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, IID, Вы писали:


IID>>В любом случае будет расход кучи тактов.


GN>А главное, что это будет в исключительной ситуации


Меня интересует с какой скоростью сервер будет обрабатывать запросы, меня не интересует с какой скоростью он не будет обрабатывать запросы.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.