⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base.js.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
字号:
// Copyright 2008 the V8 project authors. All rights reserved.// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:////     * Redistributions of source code must retain the above copyright//       notice, this list of conditions and the following disclaimer.//     * Redistributions in binary form must reproduce the above//       copyright notice, this list of conditions and the following//       disclaimer in the documentation and/or other materials provided//       with the distribution.//     * Neither the name of Google Inc. nor the names of its//       contributors may be used to endorse or promote products derived//       from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.// Simple framework for running the benchmark suites and// computing a score based on the timing measurements.// A benchmark has a name (string) and a function that will be run to// do the performance measurement.function Benchmark(name, run) {  this.name = name;  this.run = run;}// Benchmark results hold the benchmark and the measured time used to// run the benchmark. The benchmark score is computed later once a// full benchmark suite has run to completion.function BenchmarkResult(benchmark, time) {  this.benchmark = benchmark;  this.time = time;}// Automatically convert results to numbers. Used by the geometric// mean computation.BenchmarkResult.prototype.valueOf = function() {  return this.time;}// Suites of benchmarks consist of a name and the set of benchmarks in// addition to the reference timing that the final score will be based// on. This way, all scores are relative to a reference run and higher// scores implies better performance.function BenchmarkSuite(name, reference, benchmarks) {  this.name = name;  this.reference = reference;  this.benchmarks = benchmarks;  BenchmarkSuite.suites.push(this);}// Keep track of all declared benchmark suites.BenchmarkSuite.suites = [];// Scores are not comparable across versions. Bump the version if// you're making changes that will affect that scores, e.g. if you add// a new benchmark or change an existing one.BenchmarkSuite.version = '1';// Runs all registered benchmark suites and optionally yields between// each individual benchmark to avoid running for too long in the// context of browsers. Once done, the final score is reported to the// runner.BenchmarkSuite.RunSuites = function(runner) {  var continuation = null;  var suites = BenchmarkSuite.suites;  var length = suites.length;  BenchmarkSuite.scores = [];  var index = 0;  function RunStep() {    while (continuation || index < length) {      if (continuation) {        continuation = continuation();      } else {        var suite = suites[index++];        if (runner.NotifyStart) runner.NotifyStart(suite.name);        continuation = suite.RunStep(runner);      }      if (continuation && typeof window != 'undefined' && window.setTimeout) {        window.setTimeout(RunStep, 100);        return;      }    }    if (runner.NotifyScore) {      var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores);      runner.NotifyScore(Math.round(100 * score));    }  }  RunStep();}// Counts the total number of registered benchmarks. Useful for// showing progress as a percentage.BenchmarkSuite.CountBenchmarks = function() {  var result = 0;  var suites = BenchmarkSuite.suites;  for (var i = 0; i < suites.length; i++) {    result += suites[i].benchmarks.length;  }  return result;}// Computes the geometric mean of a set of numbers.BenchmarkSuite.GeometricMean = function(numbers) {  var log = 0;  for (var i = 0; i < numbers.length; i++) {    log += Math.log(numbers[i]);  }  return Math.pow(Math.E, log / numbers.length);}// Notifies the runner that we're done running a single benchmark in// the benchmark suite. This can be useful to report progress.BenchmarkSuite.prototype.NotifyStep = function(result) {  this.results.push(result);  if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name);}// Notifies the runner that we're done with running a suite and that// we have a result which can be reported to the user if needed.BenchmarkSuite.prototype.NotifyResult = function() {  var mean = BenchmarkSuite.GeometricMean(this.results);  var score = this.reference / mean;  BenchmarkSuite.scores.push(score);  if (this.runner.NotifyResult) {    this.runner.NotifyResult(this.name, Math.round(100 * score));  }}// Runs a single benchmark for at least a second and computes the// average time it takes to run a single iteration.BenchmarkSuite.prototype.RunSingle = function(benchmark) {  var elapsed = 0;  var start = new Date();  for (var n = 0; elapsed < 1000; n++) {    benchmark.run();    elapsed = new Date() - start;  }  var usec = (elapsed * 1000) / n;  this.NotifyStep(new BenchmarkResult(benchmark, usec));}// This function starts running a suite, but stops between each// individual benchmark in the suite and returns a continuation// function which can be invoked to run the next benchmark. Once the// last benchmark has been executed, null is returned.BenchmarkSuite.prototype.RunStep = function(runner) {  this.results = [];  this.runner = runner;  var length = this.benchmarks.length;  var index = 0;  var suite = this;  function RunNext() {    if (index < length) {      suite.RunSingle(suite.benchmarks[index++]);      return RunNext;    }    suite.NotifyResult();    return null;  }  return RunNext();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -