Assertion kann entweder mit assert
getan werden von <cassert>
oder static_assert
, die in die Sprache integriert ist.
Warum also nicht die Zeit manuell nehmen und dann den Zeitunterschied in einer assert
-Anweisung überprüfen?
#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
Die Präprozessordirektiven lassen nur den Code an den Compiler passieren, wenn NDEBUG
definiert ist. assert
tritt nur dann in Aktion, wenn NDEBUG
auch definiert ist und einer ohne den anderen nicht sehr gut funktioniert.
Um Namenskonflikte zu verhindern, wenn NDEBUG
mit der start
Kennung definiert ist, könnte man einig GCC-Magie mit __COUNTER__
tut die eindeutige Identifizierung (Compiler-spezifisch) oder verschieben das Ganze in einen separaten Rahmen zu machen. Es kann für Sie kein Problem sein, aber einige Leute könnten von einer bedingt definierten Variable überrascht sein, wenn sie Ihr Programm aus einer bestimmten Perspektive betrachten.
Nun, Sie könnten einen Timer starten, dann verwenden Sie eine normale Behauptung, dass die Summe weniger als was auch immer Ihr Limit ist. – BoBTFish
Beachten Sie, dass 'assert' ein * Makro * ist, das bei typischen Release-Builds nichts tut (wenn' NDEBUG' definiert ist). –
Nicht in der Sprache oder der Standardbibliothek; Das heißt, sie sind (fast) trivial zu schreiben. – utnapistim