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

Side by Side Diff: bench/benchmain.cpp

Issue 83863002: Add JSON output option to bench. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: 80 chars Created 7 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | gyp/bench.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "BenchTimer.h" 8 #include "BenchTimer.h"
9 #include "SkBenchLogger.h" 9 #include "SkBenchLogger.h"
10 #include "SkBenchmark.h" 10 #include "SkBenchmark.h"
11 #include "SkBitmapDevice.h" 11 #include "SkBitmapDevice.h"
12 #include "SkCanvas.h" 12 #include "SkCanvas.h"
13 #include "SkColorPriv.h" 13 #include "SkColorPriv.h"
14 #include "SkCommandLineFlags.h" 14 #include "SkCommandLineFlags.h"
15 #include "SkDeferredCanvas.h" 15 #include "SkDeferredCanvas.h"
16 #include "SkGraphics.h" 16 #include "SkGraphics.h"
17 #include "SkImageEncoder.h" 17 #include "SkImageEncoder.h"
18 #include "SkOSFile.h" 18 #include "SkOSFile.h"
19 #include "SkPicture.h" 19 #include "SkPicture.h"
20 #include "SkStream.h"
20 #include "SkString.h" 21 #include "SkString.h"
21 22
22 #if SK_SUPPORT_GPU 23 #if SK_SUPPORT_GPU
23 #include "GrContext.h" 24 #include "GrContext.h"
24 #include "GrContextFactory.h" 25 #include "GrContextFactory.h"
25 #include "GrRenderTarget.h" 26 #include "GrRenderTarget.h"
26 #include "SkGpuDevice.h" 27 #include "SkGpuDevice.h"
27 #include "gl/GrGLDefines.h" 28 #include "gl/GrGLDefines.h"
28 #else 29 #else
29 class GrContext; 30 class GrContext;
30 #endif // SK_SUPPORT_GPU 31 #endif // SK_SUPPORT_GPU
31 32
33 #ifdef SK_BUILD_FOR_WIN
bsalomon 2013/11/22 20:36:30 We have this same #ifdef stuff in several places,
jcgregorio 2013/11/25 14:39:16 Sure, how about include/utils/SkJSONCPP.h?
bsalomon 2013/11/25 15:28:33 SGTM
jcgregorio 2013/11/25 16:06:47 Done.
34 // json includes xlocale which generates warning 4530 because we're
35 // compiling without exceptions;
36 // see https://code.google.com/p/skia/issues/detail?id=1067
37 #pragma warning(push)
38 #pragma warning(disable : 4530)
39 #endif
40 #include "json/value.h"
41 #ifdef SK_BUILD_FOR_WIN
42 #pragma warning(pop)
43 #endif
44
32 #include <limits> 45 #include <limits>
33 46
34 enum BenchMode { 47 enum BenchMode {
35 kNormal_BenchMode, 48 kNormal_BenchMode,
36 kDeferred_BenchMode, 49 kDeferred_BenchMode,
37 kDeferredSilent_BenchMode, 50 kDeferredSilent_BenchMode,
38 kRecord_BenchMode, 51 kRecord_BenchMode,
39 kPictureRecord_BenchMode 52 kPictureRecord_BenchMode
40 }; 53 };
41 const char* BenchMode_Name[] = { 54 const char* BenchMode_Name[] = {
42 "normal", "deferred", "deferredSilent", "record", "picturerecord" 55 "normal", "deferred", "deferredSilent", "record", "picturerecord"
43 }; 56 };
44 57
45 static const char kDefaultsConfigStr[] = "defaults"; 58 static const char kDefaultsConfigStr[] = "defaults";
46 59
47 /////////////////////////////////////////////////////////////////////////////// 60 ///////////////////////////////////////////////////////////////////////////////
48 61
49 static void erase(SkBitmap& bm) { 62 static void erase(SkBitmap& bm) {
50 if (bm.config() == SkBitmap::kA8_Config) { 63 if (bm.config() == SkBitmap::kA8_Config) {
51 bm.eraseColor(SK_ColorTRANSPARENT); 64 bm.eraseColor(SK_ColorTRANSPARENT);
52 } else { 65 } else {
53 bm.eraseColor(SK_ColorWHITE); 66 bm.eraseColor(SK_ColorWHITE);
54 } 67 }
55 } 68 }
56 69
70 // Base class for writing out the bench results.
71 //
72 // TODO(jcgregorio) Add info if tests fail to converge?
73 class ResultsWriter : SkNoncopyable {
74 public:
75 virtual ~ResultsWriter() {};
76 virtual void option(const char name[], const char value[]) = 0;
77 virtual void bench(const char name[], int32_t x, int32_t y) = 0;
bsalomon 2013/11/22 20:36:30 maybe some short comments about how the caller use
jcgregorio 2013/11/25 14:39:16 Done. Also, when writing the comments I realized I
78 virtual void endBench() = 0;
79 virtual void config(const char name[]) = 0;
80 virtual void timer(const char name[], double ms) = 0;
81 virtual void end() = 0;
82 };
83
84 // This ResultsWriter handles writing out the human readable format of the
85 // bench results.
86 class LoggerResultsWriter : public ResultsWriter {
bsalomon 2013/11/22 20:36:30 I don't know much about the logger but I'm wonderi
jcgregorio 2013/11/25 14:39:16 The current logger also takes care of logging erro
bsalomon 2013/11/25 15:28:33 I don't know. I'm not really familiar with this. I
jcgregorio 2013/11/25 16:06:47 OK, ignoring for now.
87 public:
88 explicit LoggerResultsWriter(SkBenchLogger& logger, const char* timeFormat)
89 : fLogger(logger)
90 , fTimeFormat(timeFormat)
91 , fFinishedOptions(false) {
92 fLogger.logProgress("skia bench:");
93 }
94 virtual void option(const char name[], const char value[]) {
95 fLogger.logProgress(SkStringPrintf(" %s=%s", name, value));
96 }
97 virtual void bench(const char name[], int32_t x, int32_t y) {
98 if (!fFinishedOptions) {
99 fLogger.logProgress("\n");
100 fFinishedOptions = true;
101 }
102 fLogger.logProgress(SkStringPrintf(
103 "running bench [%3d %3d] %040s", x, y, name));
104 }
105 virtual void endBench() {
106 fLogger.logProgress("\n");
107 }
108 virtual void config(const char name[]) {
109 fLogger.logProgress(SkStringPrintf(" %s:", name));
110 }
111 virtual void timer(const char name[], double ms) {
112 fLogger.logProgress(SkStringPrintf(" %s = ", name));
113 fLogger.logProgress(SkStringPrintf(fTimeFormat, ms));
114 }
115 virtual void end() {
116 fLogger.logProgress("\n");
117 }
118 private:
119 SkBenchLogger& fLogger;
120 const char* fTimeFormat;
121 bool fFinishedOptions;
122 };
123
124 // This ResultsWriter handles writing out the results in JSON.
125 //
126 // The output looks like:
127 //
128 // {
129 // "options" : {
130 // "alpha" : "0xFF",
131 // "scale" : "0",
132 // ...
133 // "system" : "UNIX"
134 // },
135 // "results" : {
136 // "Xfermode_Luminosity_640_480" : {
137 // "565" : {
138 // "cmsecs" : 143.188128906250,
139 // "msecs" : 143.835957031250
140 // },
141 // ...
142 //
143 class JSONResultsWriter : public ResultsWriter {
144 public:
145 explicit JSONResultsWriter(const char filename[])
146 : fFilename(filename)
147 , fRoot()
148 , fResults(fRoot["results"])
149 , fBench(NULL)
150 , fConfig(NULL) {
151 }
152 virtual void option(const char name[], const char value[]) {
153 fRoot["options"][name] = value;
154 }
155 virtual void bench(const char name[], int32_t x, int32_t y) {
156 fBench = &fResults[SkStringPrintf( "%s_%d_%d", name, x, y).c_str()];
157 }
158 virtual void endBench() {
159 }
160 virtual void config(const char name[]) {
161 SkASSERT(NULL != fBench);
162 fConfig = &(*fBench)[name];
163 }
164 virtual void timer(const char name[], double ms) {
165 SkASSERT(NULL != fConfig);
166 (*fConfig)[name] = ms;
167 }
168 virtual void end() {
169 SkFILEWStream stream(fFilename.c_str());
170 stream.writeText(fRoot.toStyledString().c_str());
171 stream.flush();
172 }
173 private:
174 SkString fFilename;
175 Json::Value fRoot;
176 Json::Value& fResults;
177 Json::Value* fBench;
178 Json::Value* fConfig;
179 };
180
181 // This ResultsWriter writes out to multiple ResultsWriters.
182 class MultiResultsWriter : public ResultsWriter {
183 public:
184 MultiResultsWriter() {
185 };
186 void add(ResultsWriter* writer) {
187 writers.push_back(writer);
188 }
189 virtual void option(const char name[], const char value[]) {
190 for (int i = 0; i < writers.count(); ++i) {
191 writers[i]->option(name, value);
192 }
193 }
194 virtual void bench(const char name[], int32_t x, int32_t y) {
195 for (int i = 0; i < writers.count(); ++i) {
196 writers[i]->bench(name, x, y);
197 }
198 }
199 virtual void endBench() {
200 for (int i = 0; i < writers.count(); ++i) {
201 writers[i]->endBench();
202 }
203 }
204 virtual void config(const char name[]) {
205 for (int i = 0; i < writers.count(); ++i) {
206 writers[i]->config(name);
207 }
208 }
209 virtual void timer(const char name[], double ms) {
210 for (int i = 0; i < writers.count(); ++i) {
211 writers[i]->timer(name, ms);
212 }
213 }
214 virtual void end() {
215 for (int i = 0; i < writers.count(); ++i) {
216 writers[i]->end();
217 }
218 }
219 private:
220 SkTArray<ResultsWriter *> writers;
221 };
222
57 class Iter { 223 class Iter {
58 public: 224 public:
59 Iter() : fBench(BenchRegistry::Head()) {} 225 Iter() : fBench(BenchRegistry::Head()) {}
60 226
61 SkBenchmark* next() { 227 SkBenchmark* next() {
62 if (fBench) { 228 if (fBench) {
63 BenchRegistry::Factory f = fBench->factory(); 229 BenchRegistry::Factory f = fBench->factory();
64 fBench = fBench->next(); 230 fBench = fBench->next();
65 return f(); 231 return f();
66 } 232 }
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 DEFINE_string(config, kDefaultsConfigStr, 434 DEFINE_string(config, kDefaultsConfigStr,
269 "Run configs given. By default, runs the configs marked \"runByDe fault\" in gConfigs."); 435 "Run configs given. By default, runs the configs marked \"runByDe fault\" in gConfigs.");
270 DEFINE_string(logFile, "", "Also write stdout here."); 436 DEFINE_string(logFile, "", "Also write stdout here.");
271 DEFINE_int32(minMs, 20, "Shortest time we'll allow a benchmark to run."); 437 DEFINE_int32(minMs, 20, "Shortest time we'll allow a benchmark to run.");
272 DEFINE_int32(maxMs, 4000, "Longest time we'll allow a benchmark to run."); 438 DEFINE_int32(maxMs, 4000, "Longest time we'll allow a benchmark to run.");
273 DEFINE_double(error, 0.01, 439 DEFINE_double(error, 0.01,
274 "Ratio of subsequent bench measurements must drop within 1±error t o converge."); 440 "Ratio of subsequent bench measurements must drop within 1±error t o converge.");
275 DEFINE_string(timeFormat, "%9.2f", "Format to print results, in milliseconds per 1000 loops."); 441 DEFINE_string(timeFormat, "%9.2f", "Format to print results, in milliseconds per 1000 loops.");
276 DEFINE_bool2(verbose, v, false, "Print more."); 442 DEFINE_bool2(verbose, v, false, "Print more.");
277 DEFINE_string2(resourcePath, i, NULL, "directory for test resources."); 443 DEFINE_string2(resourcePath, i, NULL, "directory for test resources.");
444 DEFINE_string(outResultsFile, "", "If given, the results will be written to the file in JSON format.");
278 445
279 // Has this bench converged? First arguments are milliseconds / loop iteration, 446 // Has this bench converged? First arguments are milliseconds / loop iteration,
280 // last is overall runtime in milliseconds. 447 // last is overall runtime in milliseconds.
281 static bool HasConverged(double prevPerLoop, double currPerLoop, double currRaw) { 448 static bool HasConverged(double prevPerLoop, double currPerLoop, double currRaw) {
282 if (currRaw < FLAGS_minMs) { 449 if (currRaw < FLAGS_minMs) {
283 return false; 450 return false;
284 } 451 }
285 const double low = 1 - FLAGS_error, high = 1 + FLAGS_error; 452 const double low = 1 - FLAGS_error, high = 1 + FLAGS_error;
286 const double ratio = currPerLoop / prevPerLoop; 453 const double ratio = currPerLoop / prevPerLoop;
287 return low < ratio && ratio < high; 454 return low < ratio && ratio < high;
288 } 455 }
289 456
290 int tool_main(int argc, char** argv); 457 int tool_main(int argc, char** argv);
291 int tool_main(int argc, char** argv) { 458 int tool_main(int argc, char** argv) {
292 #if SK_ENABLE_INST_COUNT 459 #if SK_ENABLE_INST_COUNT
293 gPrintInstCount = true; 460 gPrintInstCount = true;
294 #endif 461 #endif
295 SkAutoGraphics ag; 462 SkAutoGraphics ag;
296 SkCommandLineFlags::Parse(argc, argv); 463 SkCommandLineFlags::Parse(argc, argv);
297 464
298 // First, parse some flags. 465 // First, parse some flags.
299
300 SkBenchLogger logger; 466 SkBenchLogger logger;
301 if (FLAGS_logFile.count()) { 467 if (FLAGS_logFile.count()) {
302 logger.SetLogFile(FLAGS_logFile[0]); 468 logger.SetLogFile(FLAGS_logFile[0]);
303 } 469 }
304 470
471 LoggerResultsWriter logWriter(logger, FLAGS_timeFormat[0]);
472 MultiResultsWriter writer;
473 writer.add(&logWriter);
474 JSONResultsWriter* jsonWriter = NULL;
475 if (FLAGS_outResultsFile.count()) {
476 jsonWriter = SkNEW(JSONResultsWriter(FLAGS_outResultsFile[0]));
477 writer.add(jsonWriter);
478 }
479
305 const uint8_t alpha = FLAGS_forceBlend ? 0x80 : 0xFF; 480 const uint8_t alpha = FLAGS_forceBlend ? 0x80 : 0xFF;
306 SkTriState::State dither = SkTriState::kDefault; 481 SkTriState::State dither = SkTriState::kDefault;
307 for (size_t i = 0; i < 3; i++) { 482 for (size_t i = 0; i < 3; i++) {
308 if (strcmp(SkTriState::Name[i], FLAGS_forceDither[0]) == 0) { 483 if (strcmp(SkTriState::Name[i], FLAGS_forceDither[0]) == 0) {
309 dither = static_cast<SkTriState::State>(i); 484 dither = static_cast<SkTriState::State>(i);
310 } 485 }
311 } 486 }
312 487
313 BenchMode benchMode = kNormal_BenchMode; 488 BenchMode benchMode = kNormal_BenchMode;
314 for (size_t i = 0; i < SK_ARRAY_COUNT(BenchMode_Name); i++) { 489 for (size_t i = 0; i < SK_ARRAY_COUNT(BenchMode_Name); i++) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 } 552 }
378 } 553 }
379 } 554 }
380 #endif 555 #endif
381 556
382 // All flags should be parsed now. Report our settings. 557 // All flags should be parsed now. Report our settings.
383 if (kIsDebug) { 558 if (kIsDebug) {
384 logger.logError("bench was built in Debug mode, so we're going to hide t he times." 559 logger.logError("bench was built in Debug mode, so we're going to hide t he times."
385 " It's for your own good!\n"); 560 " It's for your own good!\n");
386 } 561 }
387 SkString str("skia bench:"); 562 writer.option("mode", FLAGS_mode[0]);
388 str.appendf(" mode=%s", FLAGS_mode[0]); 563 writer.option("alpha", SkStringPrintf("0x%02X", alpha).c_str());
389 str.appendf(" alpha=0x%02X antialias=%d filter=%d dither=%s", 564 writer.option("antialias", SkStringPrintf("%d", FLAGS_forceAA).c_str());
390 alpha, FLAGS_forceAA, FLAGS_forceFilter, SkTriState::Name[dither ]); 565 writer.option("filter", SkStringPrintf("%d", FLAGS_forceFilter).c_str());
391 str.appendf(" rotate=%d scale=%d clip=%d", FLAGS_rotate, FLAGS_scale, FLAGS_ clip); 566 writer.option("dither", SkTriState::Name[dither]);
567
568 writer.option("rotate", SkStringPrintf("%d", FLAGS_rotate).c_str());
569 writer.option("scale", SkStringPrintf("%d", FLAGS_scale).c_str());
570 writer.option("clip", SkStringPrintf("%d", FLAGS_clip).c_str());
392 571
393 #if defined(SK_SCALAR_IS_FIXED) 572 #if defined(SK_SCALAR_IS_FIXED)
394 str.append(" scalar=fixed"); 573 writer.option("scalar", "fixed");
395 #else 574 #else
396 str.append(" scalar=float"); 575 writer.option("scalar", "float");
397 #endif 576 #endif
398 577
399 #if defined(SK_BUILD_FOR_WIN32) 578 #if defined(SK_BUILD_FOR_WIN32)
400 str.append(" system=WIN32"); 579 writer.option("system", "WIN32");
401 #elif defined(SK_BUILD_FOR_MAC) 580 #elif defined(SK_BUILD_FOR_MAC)
402 str.append(" system=MAC"); 581 writer.option("system", "MAC");
403 #elif defined(SK_BUILD_FOR_ANDROID) 582 #elif defined(SK_BUILD_FOR_ANDROID)
404 str.append(" system=ANDROID"); 583 writer.option("system", "ANDROID");
405 #elif defined(SK_BUILD_FOR_UNIX) 584 #elif defined(SK_BUILD_FOR_UNIX)
406 str.append(" system=UNIX"); 585 writer.option("system", "UNIX");
407 #else 586 #else
408 str.append(" system=other"); 587 writer.option("system", "other");
409 #endif 588 #endif
410 589
411 #if defined(SK_DEBUG) 590 #if defined(SK_DEBUG)
412 str.append(" DEBUG"); 591 writer.option("build", "DEBUG");
592 #else
593 writer.option("build", "RELEASE");
413 #endif 594 #endif
414 str.append("\n");
415 logger.logProgress(str);
416
417 595
418 // Set texture cache limits if non-default. 596 // Set texture cache limits if non-default.
419 for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); ++i) { 597 for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); ++i) {
420 #if SK_SUPPORT_GPU 598 #if SK_SUPPORT_GPU
421 const Config& config = gConfigs[i]; 599 const Config& config = gConfigs[i];
422 if (SkBenchmark::kGPU_Backend != config.backend) { 600 if (SkBenchmark::kGPU_Backend != config.backend) {
423 continue; 601 continue;
424 } 602 }
425 GrContext* context = gContextFactory.get(config.contextType); 603 GrContext* context = gContextFactory.get(config.contextType);
426 if (NULL == context) { 604 if (NULL == context) {
427 continue; 605 continue;
428 } 606 }
429 607
430 size_t bytes; 608 size_t bytes;
431 int count; 609 int count;
432 context->getTextureCacheLimits(&count, &bytes); 610 context->getTextureCacheLimits(&count, &bytes);
433 if (-1 != FLAGS_gpuCacheBytes) { 611 if (-1 != FLAGS_gpuCacheBytes) {
434 bytes = static_cast<size_t>(FLAGS_gpuCacheBytes); 612 bytes = static_cast<size_t>(FLAGS_gpuCacheBytes);
435 } 613 }
436 if (-1 != FLAGS_gpuCacheCount) { 614 if (-1 != FLAGS_gpuCacheCount) {
437 count = FLAGS_gpuCacheCount; 615 count = FLAGS_gpuCacheCount;
438 } 616 }
439 context->setTextureCacheLimits(count, bytes); 617 context->setTextureCacheLimits(count, bytes);
440 #endif 618 #endif
441 } 619 }
442 620
443 // Find the longest name of the benches we're going to run to make the outpu t pretty.
444 Iter names;
445 SkBenchmark* bench;
446 size_t longestName = 0;
447 while ((bench = names.next()) != NULL) {
448 SkAutoTUnref<SkBenchmark> benchUnref(bench);
449 if (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getName())) {
450 continue;
451 }
452 const size_t length = strlen(bench->getName());
453 longestName = length > longestName ? length : longestName;
454 }
455
456 // Run each bench in each configuration it supports and we asked for. 621 // Run each bench in each configuration it supports and we asked for.
457 Iter iter; 622 Iter iter;
623 SkBenchmark* bench;
458 while ((bench = iter.next()) != NULL) { 624 while ((bench = iter.next()) != NULL) {
459 SkAutoTUnref<SkBenchmark> benchUnref(bench); 625 SkAutoTUnref<SkBenchmark> benchUnref(bench);
460 if (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getName())) { 626 if (SkCommandLineFlags::ShouldSkip(FLAGS_match, bench->getName())) {
461 continue; 627 continue;
462 } 628 }
463 629
464 bench->setForceAlpha(alpha); 630 bench->setForceAlpha(alpha);
465 bench->setForceAA(FLAGS_forceAA); 631 bench->setForceAA(FLAGS_forceAA);
466 bench->setForceFilter(FLAGS_forceFilter); 632 bench->setForceFilter(FLAGS_forceFilter);
467 bench->setDither(dither); 633 bench->setDither(dither);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 696
531 if (NULL != canvas) { 697 if (NULL != canvas) {
532 canvas->clear(SK_ColorWHITE); 698 canvas->clear(SK_ColorWHITE);
533 if (FLAGS_clip) { performClip(canvas, dim.fX, dim.fY); } 699 if (FLAGS_clip) { performClip(canvas, dim.fX, dim.fY); }
534 if (FLAGS_scale) { performScale(canvas, dim.fX, dim.fY); } 700 if (FLAGS_scale) { performScale(canvas, dim.fX, dim.fY); }
535 if (FLAGS_rotate) { performRotate(canvas, dim.fX, dim.fY); } 701 if (FLAGS_rotate) { performRotate(canvas, dim.fX, dim.fY); }
536 } 702 }
537 703
538 if (!loggedBenchName) { 704 if (!loggedBenchName) {
539 loggedBenchName = true; 705 loggedBenchName = true;
540 SkString str; 706 writer.bench(bench->getName(), dim.fX, dim.fY);
541 str.printf("running bench [%3d %3d] %*s ",
542 dim.fX, dim.fY, (int)longestName, bench->getName());
543 logger.logProgress(str);
544 } 707 }
545 708
546 #if SK_SUPPORT_GPU 709 #if SK_SUPPORT_GPU
547 SkGLContextHelper* contextHelper = NULL; 710 SkGLContextHelper* contextHelper = NULL;
548 if (SkBenchmark::kGPU_Backend == config.backend) { 711 if (SkBenchmark::kGPU_Backend == config.backend) {
549 contextHelper = gContextFactory.getGLContext(config.contextType) ; 712 contextHelper = gContextFactory.getGLContext(config.contextType) ;
550 } 713 }
551 BenchTimer timer(contextHelper); 714 BenchTimer timer(contextHelper);
552 #else 715 #else
553 BenchTimer timer; 716 BenchTimer timer;
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 // Normalize to ms per 1000 iterations. 835 // Normalize to ms per 1000 iterations.
673 const double normalize = 1000.0 / loopsPerIter; 836 const double normalize = 1000.0 / loopsPerIter;
674 const struct { char shortName; const char* longName; double ms; } ti mes[] = { 837 const struct { char shortName; const char* longName; double ms; } ti mes[] = {
675 {'w', "msecs", normalize * timer.fWall}, 838 {'w', "msecs", normalize * timer.fWall},
676 {'W', "Wmsecs", normalize * timer.fTruncatedWall}, 839 {'W', "Wmsecs", normalize * timer.fTruncatedWall},
677 {'c', "cmsecs", normalize * timer.fCpu}, 840 {'c', "cmsecs", normalize * timer.fCpu},
678 {'C', "Cmsecs", normalize * timer.fTruncatedCpu}, 841 {'C', "Cmsecs", normalize * timer.fTruncatedCpu},
679 {'g', "gmsecs", normalize * timer.fGpu}, 842 {'g', "gmsecs", normalize * timer.fGpu},
680 }; 843 };
681 844
682 SkString result; 845 writer.config(config.name);
683 result.appendf(" %s:", config.name);
684 for (size_t i = 0; i < SK_ARRAY_COUNT(times); i++) { 846 for (size_t i = 0; i < SK_ARRAY_COUNT(times); i++) {
685 if (strchr(FLAGS_timers[0], times[i].shortName) && times[i].ms > 0) { 847 if (strchr(FLAGS_timers[0], times[i].shortName) && times[i].ms > 0) {
686 result.appendf(" %s = ", times[i].longName); 848 writer.timer(times[i].longName, times[i].ms);
687 result.appendf(FLAGS_timeFormat[0], times[i].ms);
688 } 849 }
689 } 850 }
690 logger.logProgress(result);
691 } 851 }
692 if (loggedBenchName) { 852 if (loggedBenchName) {
693 logger.logProgress("\n"); 853 writer.endBench();
694 } 854 }
695 } 855 }
856 writer.end();
857 if (NULL != jsonWriter) {
858 SkDELETE(jsonWriter);
bsalomon 2013/11/22 20:36:30 I don't think you need the NULL check.
jcgregorio 2013/11/25 14:39:16 Done.
859 }
696 #if SK_SUPPORT_GPU 860 #if SK_SUPPORT_GPU
697 gContextFactory.destroyContexts(); 861 gContextFactory.destroyContexts();
698 #endif 862 #endif
699 return 0; 863 return 0;
700 } 864 }
701 865
702 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) 866 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
703 int main(int argc, char * const argv[]) { 867 int main(int argc, char * const argv[]) {
704 return tool_main(argc, (char**) argv); 868 return tool_main(argc, (char**) argv);
705 } 869 }
706 #endif 870 #endif
OLDNEW
« no previous file with comments | « no previous file | gyp/bench.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698