| Index: bench/ResultsWriter.h
|
| diff --git a/bench/ResultsWriter.h b/bench/ResultsWriter.h
|
| index 1ee3616cebe212e87a5f7a6b75afcd36b4a93c26..dc45f192f5eecfba97ee21d7ca50d044f249313a 100644
|
| --- a/bench/ResultsWriter.h
|
| +++ b/bench/ResultsWriter.h
|
| @@ -26,6 +26,10 @@ class ResultsWriter : SkNoncopyable {
|
| public:
|
| 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;
|
| +
|
| // 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;
|
| @@ -37,6 +41,9 @@ public:
|
| // Records the specific configuration a bench is run under, such as "8888".
|
| virtual void config(const char name[]) = 0;
|
|
|
| + // Records the options for a configuration, such as "GL_RENDERER".
|
| + virtual void configOption(const char name[], const char* value) = 0;
|
| +
|
| // Records a single test metric.
|
| virtual void timer(const char name[], double ms) = 0;
|
|
|
| @@ -55,6 +62,9 @@ public:
|
| , 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));
|
| }
|
| @@ -65,6 +75,9 @@ public:
|
| 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));
|
| @@ -113,6 +126,8 @@ public:
|
| , 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;
|
| }
|
| @@ -129,7 +144,84 @@ public:
|
| 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;
|
| +};
|
| +
|
| +/**
|
| + NanoJSONResultsWriter writes the test results out in the following
|
| + format:
|
| +
|
| + {
|
| + "key": {
|
| + "arch": "Arm7",
|
| + "gpu": "SGX540",
|
| + "os": "Android",
|
| + "model": "GalaxyNexus",
|
| + }
|
| + "options": {
|
| + "GL_Version": "3.1",
|
| + ...
|
| + },
|
| + "gitHash": "d1830323662ae8ae06908b97f15180fd25808894",
|
| + "results" : {
|
| + "Xfermode_Luminosity_640_480" : {
|
| + "8888" : {
|
| + "median_ms" : 143.188128906250,
|
| + "min_ms" : 143.835957031250,
|
| + ...
|
| + },
|
| + ...
|
| +*/
|
| +class NanoJSONResultsWriter : public ResultsWriter {
|
| +public:
|
| + explicit NanoJSONResultsWriter(const char filename[], const char gitHash[])
|
| + : fFilename(filename)
|
| + , fRoot()
|
| + , fResults(fRoot["results"])
|
| + , fBench(NULL)
|
| + , fConfig(NULL) {
|
| + fRoot["gitHash"] = gitHash;
|
| + }
|
| + 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;
|
| + }
|
| + virtual void bench(const char name[], int32_t x, int32_t y) {
|
| + SkString id = SkStringPrintf( "%s_%d_%d", name, x, y);
|
| + fResults[id.c_str()] = Json::Value(Json::objectValue);
|
| + fBench = &fResults[id.c_str()];
|
| + }
|
| + virtual void config(const char name[]) {
|
| + SkASSERT(NULL != fBench);
|
| + fConfig = &(*fBench)[name];
|
| + }
|
| + virtual void configOption(const char name[], const char* value) {
|
| + (*fConfig)["options"][name] = value;
|
| + }
|
| virtual void timer(const char name[], double ms) {
|
| + // Don't record if nan, or -nan.
|
| + if (sk_double_isnan(ms)) {
|
| + return;
|
| + }
|
| SkASSERT(NULL != fConfig);
|
| (*fConfig)[name] = ms;
|
| }
|
| @@ -147,6 +239,7 @@ private:
|
| Json::Value* fConfig;
|
| };
|
|
|
| +
|
| /**
|
| * This ResultsWriter writes out to multiple ResultsWriters.
|
| */
|
| @@ -157,6 +250,11 @@ public:
|
| 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);
|
| @@ -172,6 +270,11 @@ public:
|
| 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);
|
|
|