| OLD | NEW |
| 1 // Copyright 2008 the V8 project authors. All rights reserved. | 1 // Copyright 2008 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 if (runner.NotifyStart) runner.NotifyStart(suite.name); | 113 if (runner.NotifyStart) runner.NotifyStart(suite.name); |
| 114 continuation = suite.RunStep(runner); | 114 continuation = suite.RunStep(runner); |
| 115 } | 115 } |
| 116 if (continuation && typeof window != 'undefined' && window.setTimeout) { | 116 if (continuation && typeof window != 'undefined' && window.setTimeout) { |
| 117 window.setTimeout(RunStep, 100); | 117 window.setTimeout(RunStep, 100); |
| 118 return; | 118 return; |
| 119 } | 119 } |
| 120 } | 120 } |
| 121 if (runner.NotifyScore) { | 121 if (runner.NotifyScore) { |
| 122 var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores); | 122 var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores); |
| 123 runner.NotifyScore(100 * score); | 123 var formatted = BenchmarkSuite.FormatScore(100 * score); |
| 124 runner.NotifyScore(formatted); |
| 124 } | 125 } |
| 125 } | 126 } |
| 126 RunStep(); | 127 RunStep(); |
| 127 } | 128 } |
| 128 | 129 |
| 129 | 130 |
| 130 // Counts the total number of registered benchmarks. Useful for | 131 // Counts the total number of registered benchmarks. Useful for |
| 131 // showing progress as a percentage. | 132 // showing progress as a percentage. |
| 132 BenchmarkSuite.CountBenchmarks = function() { | 133 BenchmarkSuite.CountBenchmarks = function() { |
| 133 var result = 0; | 134 var result = 0; |
| 134 var suites = BenchmarkSuite.suites; | 135 var suites = BenchmarkSuite.suites; |
| 135 for (var i = 0; i < suites.length; i++) { | 136 for (var i = 0; i < suites.length; i++) { |
| 136 result += suites[i].benchmarks.length; | 137 result += suites[i].benchmarks.length; |
| 137 } | 138 } |
| 138 return result; | 139 return result; |
| 139 } | 140 } |
| 140 | 141 |
| 141 | 142 |
| 142 // Computes the geometric mean of a set of numbers. | 143 // Computes the geometric mean of a set of numbers. |
| 143 BenchmarkSuite.GeometricMean = function(numbers) { | 144 BenchmarkSuite.GeometricMean = function(numbers) { |
| 144 var log = 0; | 145 var log = 0; |
| 145 for (var i = 0; i < numbers.length; i++) { | 146 for (var i = 0; i < numbers.length; i++) { |
| 146 log += Math.log(numbers[i]); | 147 log += Math.log(numbers[i]); |
| 147 } | 148 } |
| 148 return Math.pow(Math.E, log / numbers.length); | 149 return Math.pow(Math.E, log / numbers.length); |
| 149 } | 150 } |
| 150 | 151 |
| 151 | 152 |
| 153 // Converts a score value to a string with at least three significant |
| 154 // digits. |
| 155 BenchmarkSuite.FormatScore = function(value) { |
| 156 if (value > 100) { |
| 157 return value.toFixed(0); |
| 158 } else { |
| 159 return value.toPrecision(3); |
| 160 } |
| 161 } |
| 162 |
| 152 // Notifies the runner that we're done running a single benchmark in | 163 // Notifies the runner that we're done running a single benchmark in |
| 153 // the benchmark suite. This can be useful to report progress. | 164 // the benchmark suite. This can be useful to report progress. |
| 154 BenchmarkSuite.prototype.NotifyStep = function(result) { | 165 BenchmarkSuite.prototype.NotifyStep = function(result) { |
| 155 this.results.push(result); | 166 this.results.push(result); |
| 156 if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name); | 167 if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name); |
| 157 } | 168 } |
| 158 | 169 |
| 159 | 170 |
| 160 // Notifies the runner that we're done with running a suite and that | 171 // Notifies the runner that we're done with running a suite and that |
| 161 // we have a result which can be reported to the user if needed. | 172 // we have a result which can be reported to the user if needed. |
| 162 BenchmarkSuite.prototype.NotifyResult = function() { | 173 BenchmarkSuite.prototype.NotifyResult = function() { |
| 163 var mean = BenchmarkSuite.GeometricMean(this.results); | 174 var mean = BenchmarkSuite.GeometricMean(this.results); |
| 164 var score = this.reference / mean; | 175 var score = this.reference / mean; |
| 165 BenchmarkSuite.scores.push(score); | 176 BenchmarkSuite.scores.push(score); |
| 166 if (this.runner.NotifyResult) { | 177 if (this.runner.NotifyResult) { |
| 167 this.runner.NotifyResult(this.name, 100 * score); | 178 var formatted = BenchmarkSuite.FormatScore(100 * score); |
| 179 this.runner.NotifyResult(this.name, formatted); |
| 168 } | 180 } |
| 169 } | 181 } |
| 170 | 182 |
| 171 | 183 |
| 172 // Notifies the runner that running a benchmark resulted in an error. | 184 // Notifies the runner that running a benchmark resulted in an error. |
| 173 BenchmarkSuite.prototype.NotifyError = function(error) { | 185 BenchmarkSuite.prototype.NotifyError = function(error) { |
| 174 if (this.runner.NotifyError) { | 186 if (this.runner.NotifyError) { |
| 175 this.runner.NotifyError(this.name, error); | 187 this.runner.NotifyError(this.name, error); |
| 176 } | 188 } |
| 177 if (this.runner.NotifyStep) { | 189 if (this.runner.NotifyStep) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 suite.NotifyError(e); | 224 suite.NotifyError(e); |
| 213 return null; | 225 return null; |
| 214 } | 226 } |
| 215 return RunNext; | 227 return RunNext; |
| 216 } | 228 } |
| 217 suite.NotifyResult(); | 229 suite.NotifyResult(); |
| 218 return null; | 230 return null; |
| 219 } | 231 } |
| 220 return RunNext(); | 232 return RunNext(); |
| 221 } | 233 } |
| 222 | |
| 223 | |
| 224 // Converts a score value to a string with at least three significant | |
| 225 // digits. | |
| 226 function formatScore(value) { | |
| 227 if (value > 100) { | |
| 228 return value.toFixed(0); | |
| 229 } else { | |
| 230 return value.toPrecision(3); | |
| 231 } | |
| 232 } | |
| OLD | NEW |