2017-01-20 4 views
4

Я знаю, что C поддерживает функциональные утверждения, используя assert(). Есть ли способ/библиотека, поддерживающий утверждения производительности в C/C++? Есть ли на других языках?Утверждения о производительности

Что-то вдоль линий следующее:

perf_assert_begin(ID1) 
... 
... 
/* assert the time taken is less than 2000 ms */ 
perf_assert_end(ID1, interval(ID1) < 2000) 
+3

Ну, вы можете запустить таймер, а затем использовать нормальное утверждение, что сумма меньше, чем любой ваш предел. – BoBTFish

+2

Обратите внимание, что 'assert' - это * макрос *, который ничего не делает для типичных релизов (когда определяется' NDEBUG'). –

+1

Не на языке или в стандартной библиотеке; Тем не менее, они (почти) тривиально писать. – utnapistim

ответ

1

Assertion можно сделать с помощью либо assert из <cassert> или static_assert, который встроен в язык.
Итак, почему бы не взять время вручную, а затем проверить разницу во времени в заявлении assert?

#include <cassert> 
#include <chrono> 

#ifndef NDEBUG 
auto start = std::chrono::high_resolution_clock::now(); 
#endif 
... 
#ifndef NDEBUG 
assert(std::chrono::duration_cast<milliseconds>(
    std::chrono::high_resolution_clock::now() - start).count() < 2000 
); 
#endif 

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

Для предотвращения конфликтов имен, когда NDEBUG определяется с start идентификатором, вы можете сделать некоторые GCC-магии с __COUNTER__, чтобы сделать уникальный идентификатор (компилятор конкретных) или переместить все это в отдельную сферу. Это может быть не проблема для вас, но некоторые люди могут быть удивлены условно определенной переменной, если они смотрят на вашу программу с определенной точки зрения.

Смежные вопросы