2017-01-20 2 views
4

Ich weiß, dass C funktionale Behauptungen mit assert() unterstützt. Gibt es irgendeine Möglichkeit/Bibliothek, die Leistungszusicherungen in C/C++ unterstützt? Gibt es in anderen Sprachen?Leistungsnachweise

Etwas nach dem Vorbild der folgenden Möglichkeiten:

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

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

+2

Beachten Sie, dass 'assert' ein * Makro * ist, das bei typischen Release-Builds nichts tut (wenn' NDEBUG' definiert ist). –

+1

Nicht in der Sprache oder der Standardbibliothek; Das heißt, sie sind (fast) trivial zu schreiben. – utnapistim

Antwort

1

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.