Стоимость броска C++ 0x исключения

Иногда вы можете передать несколько строк, разделенных пробелом, и это будет интерпретировано как \n.

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

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
14
задан Raedwald 28 November 2017 в 12:03
поделиться

9 ответов

#include <iostream>
#include <stdexcept>

struct SpaceWaster {
    SpaceWaster(int l, SpaceWaster *p) : level(l), prev(p) {}
    // we want the destructor to do something
    ~SpaceWaster() { prev = 0; }
    bool checkLevel() { return level == 0; }
    int level;
    SpaceWaster *prev;
};

void thrower(SpaceWaster *current) {
    if (current->checkLevel()) throw std::logic_error("some error message goes here\n");
    SpaceWaster next(current->level - 1, current);
    // typical exception-using code doesn't need error return values
    thrower(&next);
    return;
}

int returner(SpaceWaster *current) {
    if (current->checkLevel()) return -1;
    SpaceWaster next(current->level - 1, current);
    // typical exception-free code requires that return values be handled
    if (returner(&next) == -1) return -1;
    return 0;
}

int main() {
    const int repeats = 1001;
    int returns = 0;
    SpaceWaster first(1000, 0);

    for (int i = 0; i < repeats; ++i) {
        #ifdef THROW
            try {
                thrower(&first);
            } catch (std::exception &e) {
                ++returns;
            }
        #else
            returner(&first);
            ++returns;
        #endif
    }
    #ifdef THROW
        std::cout << returns << " exceptions\n";
    #else
        std::cout << returns << " returns\n";
    #endif
}

Результаты тестирования Микки Мауса:

$ make throw -B && time ./throw
g++     throw.cpp   -o throw
1001 returns

real    0m0.547s
user    0m0.421s
sys     0m0.046s

$ make throw CPPFLAGS=-DTHROW -B && time ./throw
g++  -DTHROW   throw.cpp   -o throw
1001 exceptions

real    0m2.047s
user    0m1.905s
sys     0m0.030s

Итак, в этом случае генерация исключения на 1000 уровней стека вместо обычного возврата занимает около 1,5 мс. Это включает в себя ввод блока try, который, как я полагаю, в некоторых системах является бесплатным во время выполнения, в других требует затрат каждый раз, когда вы вводите команду try, а в других случаях взимается плата только при каждом входе в функцию, содержащую попытку. Для более вероятных 100 уровней стека я увеличил количество повторов до 10k, потому что все было в 10 раз быстрее. Таким образом, стоимость исключения составляет 0,1 мс.

Для 10 000 уровней стека это было 18,7 с по сравнению с 4,1 с, то есть около 14 мс дополнительных затрат для исключения. Итак, в этом примере мы наблюдаем довольно последовательные накладные расходы в размере 1,5 мкс на уровень стека (где каждый уровень разрушает один объект).

Очевидно, что C ++ 0x не делает этого. t указать производительность для исключений (или чего-либо еще, кроме сложности большого О для алгоритмов и структур данных). Я не думаю, что это изменяет исключения таким образом, чтобы серьезно или отрицательно повлиять на многие реализации.

36
ответ дан 1 December 2019 в 05:50
поделиться

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

Вы действительно должны использовать исключения для «исключительных условий», а не для общей логической обработки. Исключения идеально подходят для разделения обычных путей кода и ошибок.

14
ответ дан 1 December 2019 в 05:50
поделиться

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

try{
    CheckInterrupts();
    *(uint32_t*)&op_cache=ReadDword(cCS,eip);
    (this->*Opcodes[op_cache[0]])();
    //operate on the this class with the opcode functions in this class
    eip=(uint16_t)eip+1;

}
//eventually, handle these and do CpuInts...
catch(CpuInt_excp err){
    err.code&=0x00FF;
    switch(err.code){

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

Для меня это дорого

8
ответ дан 1 December 2019 в 05:50
поделиться

Я думаю, что задан неправильный вопрос.
Стоимость исключения бесполезна, более полезна стоимость исключений по сравнению с альтернативой. Поэтому вам нужно измерить, сколько стоят исключения, и сравнить это с возвратом кодов ошибок >>> И <<< проверка кодов ошибок на каждом уровне стека.

Также обратите внимание, что использование исключений не должно выполняться, когда у вас есть контроль из всего. Внутри класса, вероятно, лучше использовать возврат кода ошибки. Исключения следует использовать для передачи управления во время выполнения, когда вы не можете определить, как (или в каком контексте) ваш объект будет использоваться во время выполнения.

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

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

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

Ответ, как всегда, зависит (выполните и профилирование, и используйте быстрый помощник, если это то, что вам нужно).

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

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

Ответ, как всегда, зависит (выполните и профилирование, и используйте быстрый помощник, если это то, что вам нужно).

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

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

Ответ, как всегда, зависит (выполните и профилирование, и используйте быстрый помощник, если это то, что вам нужно).

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

Ответ, как всегда, зависит (выполните и профилирование, и используйте быстрый помощник, если это то, что вам нужно).

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

Ответ, как всегда, зависит (выполните и профилирование, и используйте быстрый помощник, если это то, что вам нужно).

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

10
ответ дан 1 December 2019 в 05:50
поделиться

Я не думаю, что C ++ 0x добавляет или изменяет что-либо в способе работы исключений C ++. Общие рекомендации см. здесь .

4
ответ дан 1 December 2019 в 05:50
поделиться

Нет причин, по которым исключения в C ++ 0x должны быть быстрее или медленнее, чем в C ++ 03. А это означает, что их производительность полностью зависит от реализации. Windows использует совершенно разные структуры данных для реализации обработки исключений в 32-битной и 64-битной версиях, а также в Itanium и x86. Linux также не гарантирует использование одной-единственной реализации. Это зависит. Существует несколько популярных способов реализации обработки исключений, и все они имеют свои преимущества и недостатки.

Таким образом, это зависит не от языка (c ++ 03 против 0x), а от компилятора, библиотеки времени выполнения, ОС и архитектуры процессора. .

6
ответ дан 1 December 2019 в 05:50
поделиться

Можно было бы предположить, что у них будет примерно такая же производительность, как и в C ++ 03, что «очень медленно!» И нет, исключения следует использовать в исключительных случаях из-за конструкции try-catch-throw на любом языке. Вы делаете что-то не так, если используете throw для управления потоком программы в java.

3
ответ дан 1 December 2019 в 05:50
поделиться

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

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

РЕДАКТИРОВАТЬ: И поскольку это получило отрицательный голос (плюс положительный голос, так что +8 для меня!), Я поясню вышеизложенное с меньшим юмором и дополнительной информацией: исключение, по крайней мере, в Земля C ++ требует RTTI и компилятора и, возможно, магии операционной системы, что делает их производительность гигантской черной дырой неопределенности. (Вам даже не гарантируется, что они будут стрелять, но такие случаи случаются во время других более серьезных событий,

0
ответ дан 1 December 2019 в 05:50
поделиться

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

Насколько я понял из некоторых чтений для Visual C ++, например, в код встроены довольно сложные структуры и логика, обеспечивающие это. Поскольку большинство функций могут вызывать другие функции, которые могут вызывать исключения, некоторые накладные расходы на раскручивание стека могут существовать даже в этих случаях.

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

-1
ответ дан 1 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: