| Index: tools/perf/benchmarks/peacekeeper.py
|
| diff --git a/tools/perf/benchmarks/peacekeeper.py b/tools/perf/benchmarks/peacekeeper.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bd73660cb51158d9f89b0d392236069f8e929841
|
| --- /dev/null
|
| +++ b/tools/perf/benchmarks/peacekeeper.py
|
| @@ -0,0 +1,202 @@
|
| +# Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +"""PeaceKeeper benchmark suite.
|
| +
|
| +Peacekeeper measures browser's performance by testing its JavaScript
|
| +functionality. JavaScript is a widely used programming language used in the
|
| +creation of modern websites to provide features such as animation, navigation,
|
| +forms and other common requirements. By measuring a browser's ability to handle
|
| +commonly used JavaScript functions Peacekeeper can evaluate its performance.
|
| +Peacekeeper scores are measured in operations per second or rendered frames per
|
| +second depending on the test. Final Score is computed by calculating geometric
|
| +mean of individual tests scores.
|
| +"""
|
| +
|
| +import os
|
| +
|
| +from metrics import statistics
|
| +from telemetry import test
|
| +from telemetry.page import page_measurement
|
| +from telemetry.page import page_set
|
| +
|
| +
|
| +class PeaceKeeperMeasurement(page_measurement.PageMeasurement):
|
| +
|
| + def WillNavigateToPage(self, page, tab):
|
| + page.script_to_evaluate_on_commit = """
|
| + var __results = {};
|
| + var _done = false;
|
| + var __real_log = window.console.log;
|
| + var test_frame = null;
|
| + var benchmark = null;
|
| + window.console.log = function(msg) {
|
| + if (typeof(msg) == "string" && (msg.indexOf("benchmark")) == 0) {
|
| + test_frame = document.getElementById("testFrame");
|
| + benchmark = test_frame.contentWindow.benchmark;
|
| + test_frame.contentWindow.onbeforeunload = {};
|
| + if ((msg.indexOf("Submit ok.")) != -1) {
|
| + _done = true;
|
| + var __data = {};
|
| + __results["test"] = benchmark.testObjectName;
|
| + __results["score"] = benchmark.test.result;
|
| + if (typeof(benchmark.test.unit) != "undefined") {
|
| + __results["unit"] = benchmark.test.unit;
|
| + } else {
|
| + __results["unit"] = benchmark.test.isFps ? "fps" : "ops";
|
| + }
|
| + }
|
| + }
|
| + __real_log.apply(this, [msg]);
|
| + }
|
| + """
|
| +
|
| + def MeasurePage(self, _, tab, results):
|
| + tab.WaitForJavaScriptExpression('_done', 600)
|
| + result = tab.EvaluateJavaScript('__results')
|
| +
|
| + results.Add('Score', 'score', int(result['score']), result['test'],
|
| + 'unimportant')
|
| +
|
| + def DidRunTest(self, browser, results):
|
| + # Calculate geometric mean as the total for the combined tests.
|
| + scores = []
|
| + for result in results.page_results:
|
| + scores.append(result['Score'].output_value)
|
| + total = statistics.GeometricMean(scores)
|
| + results.AddSummary('Score', 'score', total, 'Total')
|
| +
|
| +
|
| +class PeaceKeeperBenchmark(test.Test):
|
| + """A base class for Peackeeper benchmarks."""
|
| + test = PeaceKeeperMeasurement
|
| +
|
| + def CreatePageSet(self, options):
|
| + """Makes a PageSet for PeaceKeeper benchmarks."""
|
| + # Subclasses are expected to define a class member called query_param.
|
| + if not hasattr(self, 'test_param'):
|
| + raise NotImplementedError('test_param not in PeaceKeeper benchmark.')
|
| +
|
| + # The docstring of benchmark classes may also be used as a description
|
| + # when 'run_benchmarks list' is run.
|
| + description = self.__doc__ or 'PeaceKeeper Benchmark'
|
| + test_urls = []
|
| + for test_name in self.test_param:
|
| + test_urls.append(
|
| + {"url": ("http://peacekeeper.futuremark.com/run.action?debug=true&"
|
| + "repeat=false&forceSuiteName=%s&forceTestName=%s") %
|
| + (self.tag, test_name)
|
| + })
|
| +
|
| + page_set_dict = {
|
| + 'description': description,
|
| + 'archive_data_file': '../page_sets/data/peacekeeper_%s.json' % self.tag,
|
| + 'make_javascript_deterministic': False,
|
| + 'pages': test_urls,
|
| + }
|
| + return page_set.PageSet.FromDict(page_set_dict, os.path.abspath(__file__))
|
| +
|
| +
|
| +class PeaceKeeperRender(PeaceKeeperBenchmark):
|
| + """PeaceKeeper rendering benchmark suite.
|
| +
|
| + These tests measure your browser's ability to render and modify specific
|
| + elements used in typical web pages. Rendering tests manipulate the DOM tree in
|
| + real-time. The tests measure display updating speed (frames per seconds).
|
| + """
|
| + tag = 'render'
|
| + test_param = ['renderGrid01',
|
| + 'renderGrid02',
|
| + 'renderGrid03',
|
| + 'renderPhysics'
|
| + ]
|
| +
|
| +
|
| +class PeaceKeeperData(PeaceKeeperBenchmark):
|
| + """PeaceKeeper Data operations benchmark suite.
|
| +
|
| + These tests measure your browser's ability to add, remove and modify data
|
| + stored in an array. The Data suite consists of two tests:
|
| + 1. arrayCombined: This test uses all features of the JavaScript Array object.
|
| + This is a technical test that is not based on profiled data.
|
| + The source data are different sized arrays of numbers.
|
| + 2. arrayWeighted: This test is similar to 'arrayCombined', but the load is
|
| + balanced based on profiled data. The source data is a list of all the
|
| + countries in the world.
|
| + """
|
| +
|
| + tag = 'array'
|
| + test_param = ['arrayCombined01',
|
| + 'arrayWeighted'
|
| + ]
|
| +
|
| +
|
| +class PeaceKeeperDom(PeaceKeeperBenchmark):
|
| + """PeaceKeeper DOM operations benchmark suite.
|
| +
|
| + These tests emulate the methods used to create typical dynamic webpages.
|
| + The DOM tests are based on development experience and the capabilities of the
|
| + jQuery framework.
|
| + 1. domGetElements: This test uses native DOM methods getElementById and
|
| + getElementsByName. The elements are not modified.
|
| + 2. domDynamicCreationCreateElement: A common use of DOM is to dynamically
|
| + create content with JavaScript, this test measures creating objects
|
| + individually and then appending them to DOM.
|
| + 3. domDynamicCreationInnerHTML: This test is similarl to the previous one,
|
| + but uses the innerHTML-method.
|
| + 4. domJQueryAttributeFilters: This test does a DOM query with jQuery.
|
| + It searches elements with specific attributes.
|
| + 5. domJQueryBasicFilters: This test uses filters to query elements from DOM.
|
| + 6. domJQueryBasics: This test queries elements from DOM with basic methods.
|
| + It is similar to domGetElements, but uses jQuery rather than native methods.
|
| + 7. domJQueryContentFilters: Query elements based on content. This does string
|
| + searching and these methods are assumed to be time consuming.
|
| + 8. domJQueryHierarchy: Query elements based on hierarchy, such as getting
|
| + sibling, parent or child nodes from a DOM tree.
|
| + 9. domQueryselector: QuerySelector, which allows JavaScript to search elements
|
| + from the DOM tree directly without the need to iterate the whole tree
|
| + through domGetElements.
|
| + """
|
| +
|
| + tag = 'dom'
|
| + test_param = ['domGetElements',
|
| + 'domDynamicCreationCreateElement',
|
| + 'domDynamicCreationInnerHTML',
|
| + 'domJQueryAttributeFilters',
|
| + 'domJQueryBasicFilters',
|
| + 'domJQueryBasics',
|
| + 'domJQueryContentFilters',
|
| + 'domJQueryHierarchy',
|
| + 'domQueryselector'
|
| + ]
|
| +
|
| +
|
| +class PeaceKeeperTextParsing(PeaceKeeperBenchmark):
|
| + """PeaceKeeper Text Parsing benchmark suite.
|
| +
|
| + These tests measure your browser's performance in typical text manipulations
|
| + such as using a profanity filter for chats, browser detection and form
|
| + validation.
|
| + 1. stringChat: This test removes swearing from artificial chat messages.
|
| + Test measures looping and string replace-method.
|
| + 2. stringDetectBrowser: This test uses string indexOf-method to detect browser
|
| + and operating system.
|
| + 3. stringFilter: This test filters a list of movies with a given keyword.
|
| + The behaviour is known as filtering select or continuous filter. It's used
|
| + to give real time suggestions while a user is filling input fields.
|
| + The test uses simple regular expressions.
|
| + 4. stringValidateForm: This test uses complex regular expressions to validate
|
| + user input.
|
| + 5. stringWeighted: This is an artificial test. Methods used and their
|
| + intensities are chosen based on profiled data.
|
| + """
|
| +
|
| + tag = 'string'
|
| + test_param = ['stringChat',
|
| + 'stringDetectBrowser',
|
| + 'stringFilter',
|
| + 'stringWeighted',
|
| + 'stringValidateForm'
|
| + ]
|
| +
|
|
|