aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/ResultsWriter.h
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2014-08-20 11:45:00 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-08-20 11:45:00 -0700
commit1915b62637bea20e1471a8a358b22e9e47a4a385 (patch)
tree029df75c507944e54a0791c9da32016b2cad7cea /bench/ResultsWriter.h
parent1a17f7aeb2c735db64c977e2dd7910b00afc23a5 (diff)
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 <git hash> build_number <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
Diffstat (limited to 'bench/ResultsWriter.h')
-rw-r--r--bench/ResultsWriter.h236
1 files changed, 29 insertions, 207 deletions
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<ResultsWriter *> writers;
-};
-
-/**
- * Calls the end() method of T on destruction.
- */
-template <typename T> class CallEnd : SkNoncopyable {
-public:
- CallEnd(T& obj) : fObj(obj) {}
- ~CallEnd() { fObj.end(); }
-private:
- T& fObj;
-};
-
#endif