Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: tools/PictureResultsWriter.h

Issue 286903025: PictureBenchmark JSON logging (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: More style fixes Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/PictureBenchmark.cpp ('k') | tools/bench_pictures_main.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 *
7 * Classes for writing out bench results in various formats.
8 */
9 #ifndef SkPictureResultsWriter_DEFINED
10 #define SkPictureResultsWriter_DEFINED
11
12 #include "ResultsWriter.h"
13 #include "SkBenchLogger.h"
14 #include "SkJSONCPP.h"
15 #include "SkStream.h"
16 #include "SkString.h"
17 #include "SkTArray.h"
18
19 /**
20 * Base class for writing picture bench results.
21 */
22 class PictureResultsWriter : SkNoncopyable {
23 public:
24 enum TileFlags {kPurging, kAvg};
25
26 PictureResultsWriter() {}
27 virtual ~PictureResultsWriter() {}
28
29 virtual void bench(const char name[], int32_t x, int32_t y) = 0;
30 virtual void tileConfig(SkString configName) = 0;
31 virtual void tileMeta(int x, int y, int tx, int ty) = 0;
32 virtual void addTileFlag(PictureResultsWriter::TileFlags flag) = 0;
33 virtual void tileData(
34 TimerData* data,
35 const char format[],
36 const TimerData::Result result,
37 uint32_t timerTypes,
38 int numInnerLoops = 1) = 0;
39 virtual void end() = 0;
40 };
41
42 /**
43 * This class allows bench data to be piped into multiple
44 * PictureResultWriter classes. It does not own any classes
45 * passed to it, so the owner is required to manage any classes
46 * passed to PictureResultsMultiWriter */
47 class PictureResultsMultiWriter : public PictureResultsWriter {
48 public:
49 PictureResultsMultiWriter()
50 : fWriters() {}
51 void add(PictureResultsWriter* newWriter) {
52 fWriters.push_back(newWriter);
53 }
54 virtual ~PictureResultsMultiWriter() {}
55 virtual void bench(const char name[], int32_t x, int32_t y) {
56 for(int i=0; i<fWriters.count(); ++i) {
57 fWriters[i]->bench(name, x, y);
58 }
59 }
60 virtual void tileConfig(SkString configName) {
61 for(int i=0; i<fWriters.count(); ++i) {
62 fWriters[i]->tileConfig(configName);
63 }
64 }
65 virtual void tileMeta(int x, int y, int tx, int ty) {
66 for(int i=0; i<fWriters.count(); ++i) {
67 fWriters[i]->tileMeta(x, y, tx, ty);
68 }
69 }
70 virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
71 for(int i=0; i<fWriters.count(); ++i) {
72 fWriters[i]->addTileFlag(flag);
73 }
74 }
75 virtual void tileData(
76 TimerData* data,
77 const char format[],
78 const TimerData::Result result,
79 uint32_t timerTypes,
80 int numInnerLoops = 1) {
81 for(int i=0; i<fWriters.count(); ++i) {
82 fWriters[i]->tileData(data, format, result, timerTypes,
83 numInnerLoops);
84 }
85 }
86 virtual void end() {
87 for(int i=0; i<fWriters.count(); ++i) {
88 fWriters[i]->end();
89 }
90 }
91 private:
92 SkTArray<PictureResultsWriter*> fWriters;
93 };
94
95 /**
96 * Writes to SkBenchLogger to mimic original behavior
97 */
98 class PictureResultsLoggerWriter : public PictureResultsWriter {
99 private:
100 void logProgress(const char str[]) {
101 if(fLogger != NULL) {
102 fLogger->logProgress(str);
103 }
104 }
105 public:
106 PictureResultsLoggerWriter(SkBenchLogger* log)
107 : fLogger(log), currentLine() {}
108 virtual void bench(const char name[], int32_t x, int32_t y) {
109 SkString result;
110 result.printf("running bench [%i %i] %s ", x, y, name);
111 this->logProgress(result.c_str());
112 }
113 virtual void tileConfig(SkString configName) {
114 currentLine = configName;
115 }
116 virtual void tileMeta(int x, int y, int tx, int ty) {
117 currentLine.appendf(": tile [%i,%i] out of [%i,%i]", x, y, tx, ty);
118 }
119 virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
120 if(flag == PictureResultsWriter::kPurging) {
121 currentLine.append(" <withPurging>");
122 } else if(flag == PictureResultsWriter::kAvg) {
123 currentLine.append(" <averaged>");
124 }
125 }
126 virtual void tileData(
127 TimerData* data,
128 const char format[],
129 const TimerData::Result result,
130 uint32_t timerTypes,
131 int numInnerLoops = 1) {
132 SkString results = data->getResult(format, result,
133 currentLine.c_str(), timerTypes, numInnerLoops);
134 results.append("\n");
135 this->logProgress(results.c_str());
136 }
137 virtual void end() {}
138 private:
139 SkBenchLogger* fLogger;
140 SkString currentLine;
141 };
142
143 #ifdef SK_BUILD_JSON_WRITER
144 /**
145 * This PictureResultsWriter collects data in a JSON node
146 *
147 * The format is something like
148 * {
149 * benches: [
150 * {
151 * name: "Name_of_test"
152 * tilesets: [
153 * {
154 * name: "Name of the configuration"
155 * tiles: [
156 * {
157 * flags: {
158 * purging: true //Flags for the current tile
159 * // are put here
160 * }
161 * data: {
162 * wsecs: [....] //Actual data ends up here
163 * }
164 * }
165 * ]
166 * }
167 * ]
168 * }
169 * ]
170 * }*/
171
172 class PictureJSONResultsWriter : public PictureResultsWriter {
173 public:
174 PictureJSONResultsWriter(const char filename[])
175 : fFilename(filename),
176 fRoot(),
177 fCurrentBench(NULL),
178 fCurrentTileSet(NULL),
179 fCurrentTile(NULL) {}
180
181 virtual void bench(const char name[], int32_t x, int32_t y) {
182 SkString sk_name(name);
183 sk_name.append("_");
184 sk_name.appendS32(x);
185 sk_name.append("_");
186 sk_name.appendS32(y);
187 Json::Value* bench_node = SkFindNamedNode(&fRoot["benches"], sk_name.c_s tr());
188 fCurrentBench = &(*bench_node)["tileSets"];
189 }
190 virtual void tileConfig(SkString configName) {
191 SkASSERT(fCurrentBench != NULL);
192 fCurrentTileSet = SkFindNamedNode(fCurrentBench, configName.c_str());
193 fCurrentTile = &(*fCurrentTileSet)["tiles"][0];
194 }
195 virtual void tileMeta(int x, int y, int tx, int ty) {
196 SkASSERT(fCurrentTileSet != NULL);
197 (*fCurrentTileSet)["tx"] = tx;
198 (*fCurrentTileSet)["ty"] = ty;
199 fCurrentTile = &(*fCurrentTileSet)["tiles"][x+tx*y];
200 }
201 virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
202 SkASSERT(fCurrentTile != NULL);
203 if(flag == PictureResultsWriter::kPurging) {
204 (*fCurrentTile)["flags"]["purging"] = true;
205 } else if(flag == PictureResultsWriter::kAvg) {
206 (*fCurrentTile)["flags"]["averaged"] = true;
207 }
208 }
209 virtual void tileData(
210 TimerData* data,
211 const char format[],
212 const TimerData::Result result,
213 uint32_t timerTypes,
214 int numInnerLoops = 1) {
215 SkASSERT(fCurrentTile != NULL);
216 (*fCurrentTile)["data"] = data->getJSON(timerTypes, result, numInnerLoop s);
217 }
218 virtual void end() {
219 SkFILEWStream stream(fFilename.c_str());
220 stream.writeText(Json::FastWriter().write(fRoot).c_str());
221 stream.flush();
222 }
223 private:
224 SkString fFilename;
225 Json::Value fRoot;
226 Json::Value *fCurrentBench;
227 Json::Value *fCurrentTileSet;
228 Json::Value *fCurrentTile;
229 };
230 #endif // SK_BUILD_JSON_WRITER
231
232 #endif
OLDNEW
« no previous file with comments | « tools/PictureBenchmark.cpp ('k') | tools/bench_pictures_main.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698