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

Side by Side Diff: tools/PictureBenchmark.cpp

Issue 19862002: Do timer allocation and string building outside of bench loops (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: on top of tot Created 7 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « tools/PictureBenchmark.h ('k') | tools/bbh_shootout.cpp » ('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 2012 Google Inc. 2 * Copyright 2012 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 "SkBenchLogger.h" 8 #include "SkBenchLogger.h"
9 #include "BenchTimer.h" 9 #include "BenchTimer.h"
10 #include "PictureBenchmark.h" 10 #include "PictureBenchmark.h"
11 #include "SkCanvas.h" 11 #include "SkCanvas.h"
12 #include "SkPicture.h" 12 #include "SkPicture.h"
13 #include "SkString.h" 13 #include "SkString.h"
14 #include "picture_utils.h" 14 #include "picture_utils.h"
15 #include "TimerData.h"
16 15
17 namespace sk_tools { 16 namespace sk_tools {
18 17
19 PictureBenchmark::PictureBenchmark() 18 PictureBenchmark::PictureBenchmark()
20 : fRepeats(1) 19 : fRepeats(1)
21 , fLogger(NULL) 20 , fLogger(NULL)
22 , fRenderer(NULL) 21 , fRenderer(NULL)
23 , fLogPerIter(false) 22 , fTimerResult(TimerData::kAvg_Result)
24 , fPrintMin(false) 23 , fTimerTypes(0)
25 , fShowWallTime(false)
26 , fShowTruncatedWallTime(false)
27 , fShowCpuTime(true)
28 , fShowTruncatedCpuTime(false)
29 , fShowGpuTime(false)
30 , fTimeIndividualTiles(false) 24 , fTimeIndividualTiles(false)
31 {} 25 {}
32 26
33 PictureBenchmark::~PictureBenchmark() { 27 PictureBenchmark::~PictureBenchmark() {
34 SkSafeUnref(fRenderer); 28 SkSafeUnref(fRenderer);
35 } 29 }
36 30
31 void PictureBenchmark::setTimersToShow(bool wall,
32 bool truncatedWall,
33 bool cpu,
34 bool truncatedCpu,
35 bool gpu) {
36 fTimerTypes = 0;
37 fTimerTypes |= wall ? TimerData::kWall_Flag : 0;
38 fTimerTypes |= truncatedWall ? TimerData::kTruncatedWall_Flag : 0;
39 fTimerTypes |= cpu ? TimerData::kCpu_Flag : 0;
40 fTimerTypes |= truncatedCpu ? TimerData::kTruncatedCpu_Flag : 0;
41 fTimerTypes |= gpu ? TimerData::kGpu_Flag : 0;
42 }
43
37 BenchTimer* PictureBenchmark::setupTimer(bool useGLTimer) { 44 BenchTimer* PictureBenchmark::setupTimer(bool useGLTimer) {
38 #if SK_SUPPORT_GPU 45 #if SK_SUPPORT_GPU
39 if (useGLTimer && fRenderer != NULL && fRenderer->isUsingGpuDevice()) { 46 if (useGLTimer && fRenderer != NULL && fRenderer->isUsingGpuDevice()) {
40 return SkNEW_ARGS(BenchTimer, (fRenderer->getGLContext())); 47 return SkNEW_ARGS(BenchTimer, (fRenderer->getGLContext()));
41 } 48 }
42 #endif 49 #endif
43 return SkNEW_ARGS(BenchTimer, (NULL)); 50 return SkNEW_ARGS(BenchTimer, (NULL));
44 } 51 }
45 52
46 void PictureBenchmark::logProgress(const char msg[]) { 53 void PictureBenchmark::logProgress(const char msg[]) {
(...skipping 23 matching lines...) Expand all
70 // We throw this away to remove first time effects (such as paging in this p rogram) 77 // We throw this away to remove first time effects (such as paging in this p rogram)
71 fRenderer->setup(); 78 fRenderer->setup();
72 fRenderer->render(NULL); 79 fRenderer->render(NULL);
73 fRenderer->resetState(true); 80 fRenderer->resetState(true);
74 81
75 bool usingGpu = false; 82 bool usingGpu = false;
76 #if SK_SUPPORT_GPU 83 #if SK_SUPPORT_GPU
77 usingGpu = fRenderer->isUsingGpuDevice(); 84 usingGpu = fRenderer->isUsingGpuDevice();
78 #endif 85 #endif
79 86
87 uint32_t timerTypes = fTimerTypes;
88 if (!usingGpu) {
89 timerTypes &= ~TimerData::kGpu_Flag;
90 }
91
92 SkString timeFormat;
93 if (TimerData::kPerIter_Result == fTimerResult) {
94 timeFormat = fRenderer->getPerIterTimeFormat();
95 } else {
96 timeFormat = fRenderer->getNormalTimeFormat();
97 }
98
80 if (fTimeIndividualTiles) { 99 if (fTimeIndividualTiles) {
81 TiledPictureRenderer* tiledRenderer = fRenderer->getTiledRenderer(); 100 TiledPictureRenderer* tiledRenderer = fRenderer->getTiledRenderer();
82 SkASSERT(tiledRenderer && tiledRenderer->supportsTimingIndividualTiles() ); 101 SkASSERT(tiledRenderer && tiledRenderer->supportsTimingIndividualTiles() );
83 if (NULL == tiledRenderer || !tiledRenderer->supportsTimingIndividualTil es()) { 102 if (NULL == tiledRenderer || !tiledRenderer->supportsTimingIndividualTil es()) {
84 return; 103 return;
85 } 104 }
86 int xTiles, yTiles; 105 int xTiles, yTiles;
87 if (!tiledRenderer->tileDimensions(xTiles, yTiles)) { 106 if (!tiledRenderer->tileDimensions(xTiles, yTiles)) {
88 return; 107 return;
89 } 108 }
(...skipping 13 matching lines...) Expand all
103 // measure the small amount of time it takes to draw one tile once. 122 // measure the small amount of time it takes to draw one tile once.
104 // 123 //
105 // 2) perTileTimer, along with perTileTimerData, will record each ru n separately, and 124 // 2) perTileTimer, along with perTileTimerData, will record each ru n separately, and
106 // then take the average. As such, it supports logPerIter and printM in options. 125 // then take the average. As such, it supports logPerIter and printM in options.
107 // 126 //
108 // Although "legal", having two gpu timers running at the same time 127 // Although "legal", having two gpu timers running at the same time
109 // seems to cause problems (i.e., INVALID_OPERATIONs) on several 128 // seems to cause problems (i.e., INVALID_OPERATIONs) on several
110 // platforms. To work around this, we disable the gpu timer on the 129 // platforms. To work around this, we disable the gpu timer on the
111 // long running timer. 130 // long running timer.
112 SkAutoTDelete<BenchTimer> longRunningTimer(this->setupTimer()); 131 SkAutoTDelete<BenchTimer> longRunningTimer(this->setupTimer());
113 TimerData longRunningTimerData(tiledRenderer->getPerIterTimeFormat() , 132 TimerData longRunningTimerData(1);
114 tiledRenderer->getNormalTimeFormat()) ;
115 SkAutoTDelete<BenchTimer> perTileTimer(this->setupTimer(false)); 133 SkAutoTDelete<BenchTimer> perTileTimer(this->setupTimer(false));
116 TimerData perTileTimerData(tiledRenderer->getPerIterTimeFormat(), 134 TimerData perTileTimerData(fRepeats);
117 tiledRenderer->getNormalTimeFormat());
118 longRunningTimer->start(); 135 longRunningTimer->start();
119 for (int i = 0; i < fRepeats; ++i) { 136 for (int i = 0; i < fRepeats; ++i) {
120 perTileTimer->start(); 137 perTileTimer->start();
121 tiledRenderer->drawCurrentTile(); 138 tiledRenderer->drawCurrentTile();
122 perTileTimer->truncatedEnd(); 139 perTileTimer->truncatedEnd();
123 tiledRenderer->resetState(false); 140 tiledRenderer->resetState(false);
124 perTileTimer->end(); 141 perTileTimer->end();
125 perTileTimerData.appendTimes(perTileTimer.get(), fRepeats - 1 == i); 142 SkAssertResult(perTileTimerData.appendTimes(perTileTimer.get())) ;
126 } 143 }
127 longRunningTimer->truncatedEnd(); 144 longRunningTimer->truncatedEnd();
128 tiledRenderer->resetState(true); 145 tiledRenderer->resetState(true);
129 longRunningTimer->end(); 146 longRunningTimer->end();
130 longRunningTimerData.appendTimes(longRunningTimer.get(), true); 147 SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer.get ()));
131 148
132 SkString configName = tiledRenderer->getConfigName(); 149 SkString configName = tiledRenderer->getConfigName();
133 configName.appendf(": tile [%i,%i] out of [%i,%i]", x, y, xTiles, yT iles); 150 configName.appendf(": tile [%i,%i] out of [%i,%i]", x, y, xTiles, yT iles);
134 SkString result = perTileTimerData.getResult(fLogPerIter, fPrintMin, fRepeats, 151
135 configName.c_str(), fSh owWallTime, 152 SkString result = perTileTimerData.getResult(timeFormat.c_str(), fTi merResult,
136 fShowTruncatedWallTime, fShowCpuTime, 153 configName.c_str(), tim erTypes);
137 fShowTruncatedCpuTime,
138 usingGpu && fShowGpuTim e);
139 result.append("\n"); 154 result.append("\n");
140 155
141 // TODO(borenet): Turn off per-iteration tile time reporting for now. Avoiding logging the time 156 // TODO(borenet): Turn off per-iteration tile time reporting for now. Avoiding logging the time
142 // for every iteration for each tile cuts down on data file size by a significan t amount. Re-enable 157 // for every iteration for each tile cuts down on data file size by a significan t amount. Re-enable
143 // this once we're loading the bench data directly into a data store and are no longer generating 158 // this once we're loading the bench data directly into a data store and are no longer generating
144 // SVG graphs. 159 // SVG graphs.
145 #if 0 160 #if 0
146 this->logProgress(result.c_str()); 161 this->logProgress(result.c_str());
147 #endif 162 #endif
148 163
149 configName.append(" <averaged>"); 164 configName.append(" <averaged>");
150 SkString longRunningResult = longRunningTimerData.getResult(false, f alse, fRepeats, 165 SkString longRunningResult = longRunningTimerData.getResult(
151 configName.c_str(), fShowWallTime, fShowTruncatedWallTime, 166 tiledRenderer->getNormalTimeFormat().c_str(),
152 fShowCpuTime, fShowTruncatedCpuTime, usingGpu && fShowGpuTim e); 167 TimerData::kAvg_Result,
168 configName.c_str(), timerTypes, fRepeats);
153 longRunningResult.append("\n"); 169 longRunningResult.append("\n");
154 this->logProgress(longRunningResult.c_str()); 170 this->logProgress(longRunningResult.c_str());
155 } 171 }
156 } else { 172 } else {
157 SkAutoTDelete<BenchTimer> timer(this->setupTimer()); 173 SkAutoTDelete<BenchTimer> timer(this->setupTimer());
158 TimerData timerData(fRenderer->getPerIterTimeFormat(), fRenderer->getNor malTimeFormat()); 174 TimerData timerData(fRepeats);
159 for (int i = 0; i < fRepeats; ++i) { 175 for (int i = 0; i < fRepeats; ++i) {
160 fRenderer->setup(); 176 fRenderer->setup();
161 177
162 timer->start(); 178 timer->start();
163 fRenderer->render(NULL); 179 fRenderer->render(NULL);
164 timer->truncatedEnd(); 180 timer->truncatedEnd();
165 181
166 // Finishes gl context 182 // Finishes gl context
167 fRenderer->resetState(true); 183 fRenderer->resetState(true);
168 timer->end(); 184 timer->end();
169 185
170 timerData.appendTimes(timer.get(), fRepeats - 1 == i); 186 SkAssertResult(timerData.appendTimes(timer.get()));
171 } 187 }
172 188
173 SkString configName = fRenderer->getConfigName(); 189 SkString configName = fRenderer->getConfigName();
174 SkString result = timerData.getResult(fLogPerIter, fPrintMin, fRepeats, 190
175 configName.c_str(), fShowWallTime, 191 SkString result = timerData.getResult(timeFormat.c_str(),
176 fShowTruncatedWallTime, fShowCpuTi me, 192 fTimerResult,
177 fShowTruncatedCpuTime, usingGpu && fShowGpuTime); 193 configName.c_str(),
194 timerTypes);
178 result.append("\n"); 195 result.append("\n");
179 this->logProgress(result.c_str()); 196 this->logProgress(result.c_str());
180 } 197 }
181 198
182 fRenderer->end(); 199 fRenderer->end();
183 } 200 }
184 201
185 } 202 }
OLDNEW
« no previous file with comments | « tools/PictureBenchmark.h ('k') | tools/bbh_shootout.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698