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__
, чтобы сделать уникальный идентификатор (компилятор конкретных) или переместить все это в отдельную сферу. Это может быть не проблема для вас, но некоторые люди могут быть удивлены условно определенной переменной, если они смотрят на вашу программу с определенной точки зрения.
Ну, вы можете запустить таймер, а затем использовать нормальное утверждение, что сумма меньше, чем любой ваш предел. – BoBTFish
Обратите внимание, что 'assert' - это * макрос *, который ничего не делает для типичных релизов (когда определяется' NDEBUG'). –
Не на языке или в стандартной библиотеке; Тем не менее, они (почти) тривиально писать. – utnapistim