OLD | NEW |
1 #!/usr/bin/env dart | 1 #!/usr/bin/env dart |
2 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 /** | 6 /** |
7 * Script that prints in a table format a comparison of two benchmark results. | 7 * Script that prints in a table format a comparison of two benchmark results. |
8 * The input is given as two json files containing the benchmark results. | 8 * The input is given as two json files containing the benchmark results. |
9 */ | 9 */ |
10 library test.perf.compare; | 10 library test.perf.compare; |
11 | 11 |
12 import 'dart:io'; | 12 import 'dart:io'; |
13 import 'dart:json' as json; | 13 import 'dart:convert' show JSON; |
14 import 'dart:math' as math; | 14 import 'dart:math' as math; |
15 | 15 |
16 main() { | 16 main(args) { |
17 var args = new Options().arguments; | |
18 if (args.length < 2) { | 17 if (args.length < 2) { |
19 print('usage: compare.dart results1.json results2.json [filter]'); | 18 print('usage: compare.dart results1.json results2.json [filter]'); |
20 exit(1); | 19 exit(1); |
21 } | 20 } |
22 | 21 |
23 var path1 = args[0]; | 22 var path1 = args[0]; |
24 var path2 = args[1]; | 23 var path2 = args[1]; |
25 var file1 = new File(path1).readAsStringSync(); | 24 var file1 = new File(path1).readAsStringSync(); |
26 var file2 = new File(path2).readAsStringSync(); | 25 var file2 = new File(path2).readAsStringSync(); |
27 var filter = args.length > 2 ? new RegExp(args[2]) : null; | 26 var filter = args.length > 2 ? new RegExp(args[2]) : null; |
28 | 27 |
29 var results = []; | 28 var results = []; |
30 var map1 = json.parse(file1); | 29 var map1 = JSON.decode(file1); |
31 var map2 = json.parse(file2); | 30 var map2 = JSON.decode(file2); |
32 | 31 |
33 for (var key in map1.keys) { | 32 for (var key in map1.keys) { |
34 if (map2.containsKey(key)) { | 33 if (map2.containsKey(key)) { |
35 results.add(new ResultPair(key, map1[key], map2[key])); | 34 results.add(new ResultPair(key, map1[key], map2[key])); |
36 } else { | 35 } else { |
37 results.add(new ResultPair(key, map1[key], null)); | 36 results.add(new ResultPair(key, map1[key], null)); |
38 } | 37 } |
39 } | 38 } |
40 | 39 |
41 for (var key in map2.keys) { | 40 for (var key in map2.keys) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 num get factor => score1 == null || score2 == null ? null | 98 num get factor => score1 == null || score2 == null ? null |
100 : ((score2 - score1) * 100.0) / score1; | 99 : ((score2 - score1) * 100.0) / score1; |
101 | 100 |
102 ResultPair(this.name, double time1, double time2) | 101 ResultPair(this.name, double time1, double time2) |
103 : this.time1 = time1, this.time2 = time2, | 102 : this.time1 = time1, this.time2 = time2, |
104 score1 = time1 == null ? null : 1000000.0 / time1, | 103 score1 = time1 == null ? null : 1000000.0 / time1, |
105 score2 = time2 == null ? null : 1000000.0 / time2; | 104 score2 = time2 == null ? null : 1000000.0 / time2; |
106 | 105 |
107 String toString() { | 106 String toString() { |
108 var buff = new StringBuffer(); | 107 var buff = new StringBuffer(); |
109 buff.add(name); | 108 buff.write(name); |
110 _ensureColumn(buff, 30); | 109 _ensureColumn(buff, 30); |
111 _addNumber(buff, score1, 45); | 110 _addNumber(buff, score1, 45); |
112 _addNumber(buff, score2, 60); | 111 _addNumber(buff, score2, 60); |
113 _addNumber(buff, factor, 75, color: true); | 112 _addNumber(buff, factor, 75, color: true); |
114 return buff.toString(); | 113 return buff.toString(); |
115 } | 114 } |
116 | 115 |
117 int compareTo(ResultPair other) { | 116 int compareTo(ResultPair other) { |
118 if (name.startsWith('dart') && other.name.startsWith('js ')) return 1; | 117 if (name.startsWith('dart') && other.name.startsWith('js ')) return 1; |
119 if (name.startsWith('js ') && other.name.startsWith('dart')) return -1; | 118 if (name.startsWith('js ') && other.name.startsWith('dart')) return -1; |
120 if (factor != null && other.factor != null) { | 119 if (factor != null && other.factor != null) { |
121 var res = factor.compareTo(other.factor); | 120 var res = factor.compareTo(other.factor); |
122 if (res != 0) return res; | 121 if (res != 0) return res; |
123 } | 122 } |
124 return name.compareTo(other.name); | 123 return name.compareTo(other.name); |
125 } | 124 } |
126 } | 125 } |
127 | 126 |
128 _printLine(String col0, String col1, String col2, String col3) { | 127 _printLine(String col0, String col1, String col2, String col3) { |
129 var buff = new StringBuffer(); | 128 var buff = new StringBuffer(); |
130 buff.add(col0); | 129 buff.write(col0); |
131 _ensureColumn(buff, 30); | 130 _ensureColumn(buff, 30); |
132 _padRight(buff, col1, 45); | 131 _padRight(buff, col1, 45); |
133 _padRight(buff, col2, 60); | 132 _padRight(buff, col2, 60); |
134 _padRight(buff, col3, 75); | 133 _padRight(buff, col3, 75); |
135 print(buff.toString()); | 134 print(buff.toString()); |
136 } | 135 } |
137 | 136 |
138 _ensureColumn(StringBuffer buff, int ensure) { | 137 _ensureColumn(StringBuffer buff, int ensure) { |
139 while (buff.length < ensure) { | 138 while (buff.length < ensure) { |
140 buff.add(' '); | 139 buff.write(' '); |
141 } | 140 } |
142 } | 141 } |
143 | 142 |
144 _addNumber(StringBuffer buff, num value, int ensure, {bool color: false}) { | 143 _addNumber(StringBuffer buff, num value, int ensure, {bool color: false}) { |
145 var str; | 144 var str; |
146 if (value == null) { | 145 if (value == null) { |
147 str = '--'; | 146 str = '--'; |
148 } else { | 147 } else { |
149 str = value.toStringAsFixed(value >= 100 ? 0 : (value >= 10 ? 1 : 2)); | 148 str = value.toStringAsFixed(value >= 100 ? 0 : (value >= 10 ? 1 : 2)); |
150 } | 149 } |
151 | 150 |
152 while (buff.length + str.length < ensure) { | 151 while (buff.length + str.length < ensure) { |
153 buff.add(' '); | 152 buff.write(' '); |
154 } | 153 } |
155 if (color) _addColor(buff, value); | 154 if (color) _addColor(buff, value); |
156 buff.add(str); | 155 buff.write(str); |
157 if (color) _removeColor(buff, value); | 156 if (color) _removeColor(buff, value); |
158 } | 157 } |
159 | 158 |
160 _addColor(StringBuffer buff, num value) { | 159 _addColor(StringBuffer buff, num value) { |
161 if (value == null || value.abs() < 2) return; | 160 if (value == null || value.abs() < 2) return; |
162 var color; | 161 var color; |
163 if (value >= 2 && value < 7) { | 162 if (value >= 2 && value < 7) { |
164 color = '[32m'; | 163 color = '[32m'; |
165 } else if (value >= 7) { | 164 } else if (value >= 7) { |
166 color = '[32;1m'; | 165 color = '[32;1m'; |
167 } else if (value <= -2 && value > -7) { | 166 } else if (value <= -2 && value > -7) { |
168 color = '[38;5;208m'; | 167 color = '[38;5;208m'; |
169 } else if (value <= -7) { | 168 } else if (value <= -7) { |
170 color = '[31;1m'; | 169 color = '[31;1m'; |
171 } | 170 } |
172 buff.add(color); | 171 buff.write(color); |
173 } | 172 } |
174 | 173 |
175 _removeColor(StringBuffer buff, num value) { | 174 _removeColor(StringBuffer buff, num value) { |
176 if (value == null || value.abs() < 2) return; | 175 if (value == null || value.abs() < 2) return; |
177 buff.add('[0m'); | 176 buff.write('[0m'); |
178 } | 177 } |
179 | 178 |
180 _padRight(StringBuffer buff, String str, int ensure) { | 179 _padRight(StringBuffer buff, String str, int ensure) { |
181 while (buff.length + str.length < ensure) { | 180 while (buff.length + str.length < ensure) { |
182 buff.add(' '); | 181 buff.write(' '); |
183 } | 182 } |
184 buff.add(str); | 183 buff.write(str); |
185 } | 184 } |
186 | 185 |
187 _geomean(List<num> numbers) { | 186 _geomean(List<num> numbers) { |
188 var log = 0.0; | 187 var log = 0.0; |
189 for (var n in numbers) { | 188 for (var n in numbers) { |
190 log += math.log(n); | 189 log += math.log(n); |
191 } | 190 } |
192 return math.pow(math.E, log / numbers.length); | 191 return math.pow(math.E, log / numbers.length); |
193 } | 192 } |
OLD | NEW |