Измерение обработки исключений наверху в C++

Можно использовать {% include %} с переменной.

def some_view_after_post(request):
    # ... lookup value of myfield2 ...
    return render(request, "path/to/after_post.html", {'myfield2: myfield2})

В шаблоне after_post.html:

<!-- include a template based on user's choice -->
<div class="user-choice">
{% include myfield2 %}
</div>

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

15
задан Antti Kissaniemi 4 September 2008 в 06:38
поделиться

8 ответов

Разделите 5.4 из эти , готовят Технический Отчет на Производительности C++ , полностью посвящен издержкам исключений.

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

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

Carl

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

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

Работы над Linux и Windows до сих пор, скомпилируйте с:

g++ exception_handling.cpp -o exception_handling [ -O2 ]

или например Экспресс Visual C++ .

Для получения основного случая ("поддержка исключения, удаленная из языка в целом"), используйте:

g++ exception_handling.cpp -o exception_handling [ -O2 ] -fno-exceptions -DNO_EXCEPTIONS

или подобные настройки в MSVC.

Некоторые предварительные результаты здесь . Они - вероятно, вся неаппетитная еда из-за переменной загрузки машины, но они действительно дают некоторое представление об относительной обработке исключений наверху. (Резюме: ни один или мало когда никакие исключения не выдаются, огромны, когда они на самом деле брошены.)

#include <stdio.h>

// Timer code

#if defined(__linux__)
#include <sys/time.h>
#include <time.h>

double time()
{
    timeval tv;
    gettimeofday(&tv, 0);
    return 1.0 * tv.tv_sec + 0.000001 * tv.tv_usec;
}
#elif defined(_WIN32)
#include <windows.h>

double get_performance_frequency()
{
    unsigned _int64 frequency;
    QueryPerformanceFrequency((LARGE_INTEGER*) &frequency); // just assume it works
    return double(frequency);
}

double performance_frequency = get_performance_frequency();

double time()
{
    unsigned _int64 counter;
    QueryPerformanceCounter((LARGE_INTEGER*) &counter);
    return double(counter) / performance_frequency;
}
#else
# error time() not implemented for your platform
#endif

// How many times to repeat the whole test
const int repeats = 10;

// How many times to iterate one case
const int times = 1000000;

// Trick optimizer to not remove code
int result = 0;



// Case 1. No exception thrown nor handled.

void do_something()
{
    ++result;
}

void case1()
{
    do_something();
}



// Case 2. No exception thrown, but handler installed

#ifndef NO_EXCEPTIONS
void do_something_else()
{
    --result;
}

void case2()
{
    try
    {
        do_something();
    }
    catch (int exception)
    {
        do_something_else();
    }
}



// Case 3. Exception thrown and caught

void do_something_and_throw()
{
    throw ++result;
}

void case3()
{
    try
    {
        do_something_and_throw();
    }
    catch (int exception)
    {
        result = exception;
    }
}
#endif // !NO_EXCEPTIONS

void (*tests[])() =
{
    case1,
#ifndef NO_EXCEPTIONS
    case2,
    case3
#endif // !NO_EXCEPTIONS
};

int main()
{
#ifdef NO_EXCEPTIONS
    printf("case0\n");
#else
    printf("case1\tcase2\tcase3\n");
#endif
    for (int repeat = 0; repeat < repeats; ++repeat)
    {
        for (int test = 0; test < sizeof(tests)/sizeof(tests[0]); ++test)
        {
            double start = time();

            for (int i = 0; i < times; ++i)
                tests[test]();

            double end = time();

            printf("%f\t", (end - start) * 1000000.0 / times);
        }
        printf("\n");
    }

    return result; // optimizer is happy - we produce a result
}
8
ответ дан 1 December 2019 в 00:05
поделиться

Kevin Frei переговоры о стоимости выполнения обработки исключений в его речи" Стоимость Обработки Исключения C++ в Windows ". (В соответствии со "Сводкой & Заключения" существуют один элемент списка, который говорит" [Стоимость выполнения обработки исключений] не всегда измерима".)

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

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

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

Carl

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

Нет никакого действительно хорошего способа измерить это в коде. Необходимо было бы использовать профилировщика.

Это не покажет Вам непосредственно, сколько времени проведено с обработкой исключений, но с определенным исследованием, которое Вы узнаете, какой из методов во время выполнения имеет дело за исключениями (например, для VC ++. СЕТЬ это __ cxx_exc [...]).

Складывают их времена, и у Вас есть издержки. В нашем проекте мы использовали vTunes от Intel, которая работает и с Visual C++ и с gcc.

Редактирование: Ну, если Вам просто нужно универсальное число, которое могло бы работать. Мысль, которую у Вас было реальное приложение для профилирования, где Вы не можете только выключить исключения.

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

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

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

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

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

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

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