From 1915b62637bea20e1471a8a358b22e9e47a4a385 Mon Sep 17 00:00:00 2001 From: mtklein Date: Wed, 20 Aug 2014 11:45:00 -0700 Subject: Add --properties for things like gitHash that describe the current nanobench run. --key describes the type of run (describes the line on the chart), --properties describes the run itself (describes the dot on the chart). We'll pass --properties gitHash build_number --key ... to nanobench from the bots. And... delete a whole lot of dead code. Example: nanobench --properties gitHash foo build_number 1234 --key bar baz { "build_number" : "1234", "gitHash" : "foo", "key" : { "bar" : "baz" }, "results" : { .... Friends with https://codereview.chromium.org/491943002 BUG=skia: R=jcgregorio@google.com, mtklein@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/488213002 --- bench/ResultsWriter.h | 236 +++++++------------------------------------------- 1 file changed, 29 insertions(+), 207 deletions(-) (limited to 'bench/ResultsWriter.h') diff --git a/bench/ResultsWriter.h b/bench/ResultsWriter.h index dc45f192f5..56283732ec 100644 --- a/bench/ResultsWriter.h +++ b/bench/ResultsWriter.h @@ -20,148 +20,31 @@ /** * Base class for writing out the bench results. * - * TODO(jcgregorio) Add info if tests fail to converge? + * Default implementation does nothing. */ class ResultsWriter : SkNoncopyable { public: - virtual ~ResultsWriter() {}; + virtual ~ResultsWriter() {} - // Records one key value pair that makes up a unique identifier for this run. - // All keys must be set before calling bench(). - virtual void key(const char name[], const char value[]) = 0; + // Record one key value pair that makes up a unique key for this type of run, e.g. + // builder name, machine type, Debug/Release, etc. + virtual void key(const char name[], const char value[]) {} - // Records one option set for this run. All options must be set before - // calling bench(). - virtual void option(const char name[], const char value[]) = 0; + // Record one key value pair that describes the run instance, e.g. git hash, build number. + virtual void property(const char name[], const char value[]) {} - // Denotes the start of a specific benchmark. Once bench is called, + // Denote the start of a specific benchmark. Once bench is called, // then config and timer can be called multiple times to record runs. - virtual void bench(const char name[], int32_t x, int32_t y) = 0; + virtual void bench(const char name[], int32_t x, int32_t y) {} - // Records the specific configuration a bench is run under, such as "8888". - virtual void config(const char name[]) = 0; + // Record the specific configuration a bench is run under, such as "8888". + virtual void config(const char name[]) {} - // Records the options for a configuration, such as "GL_RENDERER". - virtual void configOption(const char name[], const char* value) = 0; + // Record the options for a configuration, such as "GL_RENDERER". + virtual void configOption(const char name[], const char* value) {} - // Records a single test metric. - virtual void timer(const char name[], double ms) = 0; - - // Call when all results are finished. - virtual void end() = 0; -}; - -/** - * This ResultsWriter handles writing out the human readable format of the - * bench results. - */ -class LoggerResultsWriter : public ResultsWriter { -public: - explicit LoggerResultsWriter(BenchLogger& logger, const char* timeFormat) - : fLogger(logger) - , fTimeFormat(timeFormat) { - fLogger.logProgress("skia bench:"); - } - virtual void key(const char name[], const char value[]) { - // Don't log keys to keep microbench output unchanged. - } - virtual void option(const char name[], const char value[]) { - fLogger.logProgress(SkStringPrintf(" %s=%s", name, value)); - } - virtual void bench(const char name[], int32_t x, int32_t y) { - fLogger.logProgress(SkStringPrintf( - "\nrunning bench [%3d %3d] %40s", x, y, name)); - } - virtual void config(const char name[]) { - fLogger.logProgress(SkStringPrintf(" %s:", name)); - } - virtual void configOption(const char name[], const char* value) { - // Don't log configOptions to keep microbench output unchanged. - } - virtual void timer(const char name[], double ms) { - fLogger.logProgress(SkStringPrintf(" %s = ", name)); - fLogger.logProgress(SkStringPrintf(fTimeFormat, ms)); - } - virtual void end() { - fLogger.logProgress("\n"); - } -private: - BenchLogger& fLogger; - const char* fTimeFormat; -}; - -/** - * This ResultsWriter handles writing out the results in JSON. - * - * The output looks like (except compressed to a single line): - * - * { - * "options" : { - * "alpha" : "0xFF", - * "scale" : "0", - * ... - * "system" : "UNIX" - * }, - * "results" : [ - * { - * "name" : "Xfermode_Luminosity_640_480", - * "results" : [ - * { - * "name": "565", - * "cmsecs" : 143.188128906250, - * "msecs" : 143.835957031250 - * }, - * ... - */ - -Json::Value* SkFindNamedNode(Json::Value* root, const char name[]); -Json::Value SkMakeBuilderJSON(const SkString &buildername); - -class JSONResultsWriter : public ResultsWriter { -public: - explicit JSONResultsWriter(const char filename[]) - : fFilename(filename) - , fRoot() - , fResults(fRoot["results"]) - , fBench(NULL) - , fConfig(NULL) { - } - virtual void key(const char name[], const char value[]) { - } - virtual void option(const char name[], const char value[]) { - fRoot["options"][name] = value; - } - virtual void bench(const char name[], int32_t x, int32_t y) { - SkString sk_name(name); - sk_name.append("_"); - sk_name.appendS32(x); - sk_name.append("_"); - sk_name.appendS32(y); - Json::Value* bench_node = SkFindNamedNode(&fResults, sk_name.c_str()); - fBench = &(*bench_node)["results"]; - } - virtual void config(const char name[]) { - SkASSERT(NULL != fBench); - fConfig = SkFindNamedNode(fBench, name); - } - virtual void configOption(const char name[], const char* value) { - } - virtual void timer(const char name[], double ms) { - SkASSERT(NULL != fConfig); - (*fConfig)[name] = ms; - } - virtual void end() { - SkFILEWStream stream(fFilename.c_str()); - stream.writeText(Json::FastWriter().write(fRoot).c_str()); - stream.flush(); - } -private: - - SkString fFilename; - Json::Value fRoot; - Json::Value& fResults; - Json::Value* fBench; - Json::Value* fConfig; + // Record a single test metric. + virtual void timer(const char name[], double ms) {} }; /** @@ -175,11 +58,8 @@ private: "os": "Android", "model": "GalaxyNexus", } - "options": { - "GL_Version": "3.1", - ... - }, "gitHash": "d1830323662ae8ae06908b97f15180fd25808894", + "build_number": "1234", "results" : { "Xfermode_Luminosity_640_480" : { "8888" : { @@ -191,19 +71,26 @@ private: */ class NanoJSONResultsWriter : public ResultsWriter { public: - explicit NanoJSONResultsWriter(const char filename[], const char gitHash[]) + explicit NanoJSONResultsWriter(const char filename[]) : fFilename(filename) , fRoot() , fResults(fRoot["results"]) , fBench(NULL) - , fConfig(NULL) { - fRoot["gitHash"] = gitHash; + , fConfig(NULL) {} + + ~NanoJSONResultsWriter() { + SkFILEWStream stream(fFilename.c_str()); + stream.writeText(Json::StyledWriter().write(fRoot).c_str()); + stream.flush(); } + + // Added under "key". virtual void key(const char name[], const char value[]) { fRoot["key"][name] = value; } - virtual void option(const char name[], const char value[]) { - fRoot["options"][name] = value; + // Inserted directly into the root. + virtual void property(const char name[], const char value[]) { + fRoot[name] = value; } virtual void bench(const char name[], int32_t x, int32_t y) { SkString id = SkStringPrintf( "%s_%d_%d", name, x, y); @@ -225,13 +112,8 @@ public: SkASSERT(NULL != fConfig); (*fConfig)[name] = ms; } - virtual void end() { - SkFILEWStream stream(fFilename.c_str()); - stream.writeText(Json::FastWriter().write(fRoot).c_str()); - stream.flush(); - } -private: +private: SkString fFilename; Json::Value fRoot; Json::Value& fResults; @@ -240,64 +122,4 @@ private: }; -/** - * This ResultsWriter writes out to multiple ResultsWriters. - */ -class MultiResultsWriter : public ResultsWriter { -public: - MultiResultsWriter() : writers() { - }; - void add(ResultsWriter* writer) { - writers.push_back(writer); - } - virtual void key(const char name[], const char value[]) { - for (int i = 0; i < writers.count(); ++i) { - writers[i]->key(name, value); - } - } - virtual void option(const char name[], const char value[]) { - for (int i = 0; i < writers.count(); ++i) { - writers[i]->option(name, value); - } - } - virtual void bench(const char name[], int32_t x, int32_t y) { - for (int i = 0; i < writers.count(); ++i) { - writers[i]->bench(name, x, y); - } - } - virtual void config(const char name[]) { - for (int i = 0; i < writers.count(); ++i) { - writers[i]->config(name); - } - } - virtual void configOption(const char name[], const char* value) { - for (int i = 0; i < writers.count(); ++i) { - writers[i]->configOption(name, value); - } - } - virtual void timer(const char name[], double ms) { - for (int i = 0; i < writers.count(); ++i) { - writers[i]->timer(name, ms); - } - } - virtual void end() { - for (int i = 0; i < writers.count(); ++i) { - writers[i]->end(); - } - } -private: - SkTArray writers; -}; - -/** - * Calls the end() method of T on destruction. - */ -template class CallEnd : SkNoncopyable { -public: - CallEnd(T& obj) : fObj(obj) {} - ~CallEnd() { fObj.end(); } -private: - T& fObj; -}; - #endif -- cgit v1.2.3