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

Side by Side Diff: pkg/analysis_server/test/performance/driver.dart

Issue 1202843010: performance measurement: generate report (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: merge Created 5 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 | « no previous file | pkg/analysis_server/test/performance/input_converter.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library server.driver; 5 library server.driver;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:math' show max; 8 import 'dart:math' show max;
9 9
10 import 'package:logging/logging.dart'; 10 import 'package:logging/logging.dart';
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 _runCompleter.complete(results); 141 _runCompleter.complete(results);
142 } 142 }
143 } 143 }
144 } 144 }
145 145
146 /** 146 /**
147 * [Measurement] tracks elapsed time for a given operation. 147 * [Measurement] tracks elapsed time for a given operation.
148 */ 148 */
149 class Measurement { 149 class Measurement {
150 final String tag; 150 final String tag;
151 final bool notification;
151 final List<Duration> elapsedTimes = new List<Duration>(); 152 final List<Duration> elapsedTimes = new List<Duration>();
152 int errorCount = 0; 153 int errorCount = 0;
154 int unexpectedResultCount = 0;
153 155
154 Measurement(this.tag); 156 Measurement(this.tag, this.notification);
157
158 int get count => elapsedTimes.length;
155 159
156 void printSummary(int keyLen) { 160 void printSummary(int keyLen) {
157 int count = 0; 161 int count = 0;
162 Duration maxTime = elapsedTimes[0];
163 Duration minTime = elapsedTimes[0];
158 int totalTimeMicros = 0; 164 int totalTimeMicros = 0;
159 for (Duration elapsed in elapsedTimes) { 165 for (Duration elapsed in elapsedTimes) {
160 ++count; 166 ++count;
161 totalTimeMicros += elapsed.inMicroseconds; 167 int timeMicros = elapsed.inMicroseconds;
168 maxTime = maxTime.compareTo(elapsed) > 0 ? maxTime : elapsed;
169 minTime = minTime.compareTo(elapsed) < 0 ? minTime : elapsed;
170 totalTimeMicros += timeMicros;
162 } 171 }
163 int averageTimeMicros = (totalTimeMicros / count).round(); 172 int averageTimeMicros = (totalTimeMicros / count).round();
164 StringBuffer sb = new StringBuffer(); 173 StringBuffer sb = new StringBuffer();
165 _printColumn(sb, tag, keyLen); 174 _printColumn(sb, tag, keyLen);
166 _printColumn(sb, count.toString(), 5, rightJustified: true); 175 _printColumn(sb, count.toString(), 6, rightJustified: true);
167 _printColumn(sb, errorCount.toString(), 5, rightJustified: true); 176 _printColumn(sb, errorCount.toString(), 6, rightJustified: true);
168 sb.write(' '); 177 _printColumn(sb, unexpectedResultCount.toString(), 6, rightJustified: true);
169 sb.write(new Duration(microseconds: averageTimeMicros)); 178 _printDuration(sb, minTime);
170 sb.write(', '); 179 _printDuration(sb, new Duration(microseconds: averageTimeMicros));
171 sb.write(new Duration(microseconds: totalTimeMicros)); 180 _printDuration(sb, maxTime);
181 _printDuration(sb, new Duration(microseconds: totalTimeMicros));
172 print(sb.toString()); 182 print(sb.toString());
173 } 183 }
174 184
175 void record(bool success, Duration elapsed) { 185 void record(bool success, Duration elapsed) {
176 if (!success) { 186 if (!success) {
177 ++errorCount; 187 ++errorCount;
178 } 188 }
179 elapsedTimes.add(elapsed); 189 elapsedTimes.add(elapsed);
180 } 190 }
191
192 void recordUnexpectedResults() {
193 ++unexpectedResultCount;
194 }
195
196 void _printDuration(StringBuffer sb, Duration duration) {
197 sb.write(' ');
198 sb.write(duration);
199 sb.write(',');
200 }
181 } 201 }
182 202
183 /** 203 /**
184 * [Results] contains information gathered by [Driver] 204 * [Results] contains information gathered by [Driver]
185 * while running the analysis server 205 * while running the analysis server
186 */ 206 */
187 class Results { 207 class Results {
188 Map<String, Measurement> measurements = new Map<String, Measurement>(); 208 Map<String, Measurement> measurements = new Map<String, Measurement>();
189 209
190 /** 210 /**
191 * Display results on stdout. 211 * Display results on stdout.
192 */ 212 */
193 void printResults() { 213 void printResults() {
214 print('');
194 print('=================================================================='); 215 print('==================================================================');
216 print('');
195 List<String> keys = measurements.keys.toList()..sort(); 217 List<String> keys = measurements.keys.toList()..sort();
196 int keyLen = keys.fold(0, (int len, String key) => max(len, key.length)); 218 int keyLen = keys.fold(0, (int len, String key) => max(len, key.length));
197 StringBuffer sb = new StringBuffer(); 219 _printGroupHeader('Request/Response', keyLen);
198 _printColumn(sb, 'Results', keyLen);
199 _printColumn(sb, 'count', 5);
200 _printColumn(sb, 'errors', 5);
201 sb.write(' average, total,');
202 print(sb.toString());
203 int totalCount = 0; 220 int totalCount = 0;
204 int totalErrorCount = 0; 221 int totalErrorCount = 0;
222 int totalUnexpectedResultCount = 0;
205 for (String tag in keys) { 223 for (String tag in keys) {
206 Measurement m = measurements[tag]; 224 Measurement m = measurements[tag];
207 m.printSummary(keyLen); 225 if (!m.notification) {
208 totalCount += m.elapsedTimes.length; 226 m.printSummary(keyLen);
209 totalErrorCount += m.errorCount; 227 totalCount += m.count;
228 totalErrorCount += m.errorCount;
229 totalUnexpectedResultCount += m.unexpectedResultCount;
230 }
210 } 231 }
211 sb.clear(); 232 _printTotals(keyLen, totalCount, totalErrorCount, totalUnexpectedResultCount );
212 _printColumn(sb, 'Totals', keyLen); 233 print('');
213 _printColumn(sb, totalCount.toString(), 5); 234 _printGroupHeader('Notifications', keyLen);
214 _printColumn(sb, totalErrorCount.toString(), 5); 235 for (String tag in keys) {
215 print(sb.toString()); 236 Measurement m = measurements[tag];
237 if (m.notification) {
238 m.printSummary(keyLen);
239 }
240 }
241 /// TODO(danrubel) *** print warnings if driver caches are not empty ****
242 print('');
243 print(
244 '(1) uxr = UneXpected Results, or responses received from the server');
245 print(
246 ' that do not match the recorded response for that request.');
216 } 247 }
217 248
218 /** 249 /**
219 * Record the elapsed time for the given operation. 250 * Record the elapsed time for the given operation.
220 */ 251 */
221 void record(String tag, Duration elapsed, {bool success: true}) { 252 void record(String tag, Duration elapsed,
253 {bool notification: false, bool success: true}) {
222 Measurement measurement = measurements[tag]; 254 Measurement measurement = measurements[tag];
223 if (measurement == null) { 255 if (measurement == null) {
224 measurement = new Measurement(tag); 256 measurement = new Measurement(tag, notification);
225 measurements[tag] = measurement; 257 measurements[tag] = measurement;
226 } 258 }
227 measurement.record(success, elapsed); 259 measurement.record(success, elapsed);
228 } 260 }
261
262 void recordUnexpectedResults(String tag) {
263 measurements[tag].recordUnexpectedResults();
264 }
265
266 void _printGroupHeader(String groupName, int keyLen) {
267 StringBuffer sb = new StringBuffer();
268 _printColumn(sb, groupName, keyLen);
269 _printColumn(sb, 'count', 6, rightJustified: true);
270 _printColumn(sb, 'error', 6, rightJustified: true);
271 _printColumn(sb, 'uxr(1)', 6, rightJustified: true);
272 sb.write(' ');
273 _printColumn(sb, 'minimum', 15);
274 _printColumn(sb, 'average', 15);
275 _printColumn(sb, 'maximum', 15);
276 _printColumn(sb, 'total', 15);
277 print(sb.toString());
278 }
279
280 void _printTotals(int keyLen, int totalCount, int totalErrorCount, int totalUn expectedResultCount) {
281 StringBuffer sb = new StringBuffer();
282 _printColumn(sb, 'Totals', keyLen);
283 _printColumn(sb, totalCount.toString(), 6, rightJustified: true);
284 _printColumn(sb, totalErrorCount.toString(), 6, rightJustified: true);
285 _printColumn(sb, totalUnexpectedResultCount.toString(), 6,
286 rightJustified: true);
287 print(sb.toString());
288 }
229 } 289 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analysis_server/test/performance/input_converter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698