Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / tools / perf / benchmarks / dromaeo.py
1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 import math
6 import os
7
8 from metrics import power
9 from telemetry import benchmark
10 from telemetry.page import page_set
11 from telemetry.page import page_test
12 from telemetry.value import scalar
13
14
15 class _DromaeoMeasurement(page_test.PageTest):
16   def __init__(self):
17     super(_DromaeoMeasurement, self).__init__()
18     self._power_metric = None
19
20   def CustomizeBrowserOptions(self, options):
21     power.PowerMetric.CustomizeBrowserOptions(options)
22
23   def WillStartBrowser(self, platform):
24     self._power_metric = power.PowerMetric(platform)
25
26   def DidNavigateToPage(self, page, tab):
27     self._power_metric.Start(page, tab)
28
29   def ValidateAndMeasurePage(self, page, tab, results):
30     tab.WaitForJavaScriptExpression(
31         'window.document.getElementById("pause") &&' +
32         'window.document.getElementById("pause").value == "Run"',
33         120)
34
35     # Start spying on POST request that will report benchmark results, and
36     # intercept result data.
37     tab.ExecuteJavaScript('(function() {' +
38                           '  var real_jquery_ajax_ = window.jQuery;' +
39                           '  window.results_ = "";' +
40                           '  window.jQuery.ajax = function(request) {' +
41                           '    if (request.url == "store.php") {' +
42                           '      window.results_ =' +
43                           '          decodeURIComponent(request.data);' +
44                           '      window.results_ = window.results_.substring(' +
45                           '          window.results_.indexOf("=") + 1, ' +
46                           '          window.results_.lastIndexOf("&"));' +
47                           '      real_jquery_ajax_(request);' +
48                           '    }' +
49                           '  };' +
50                           '})();')
51     # Starts benchmark.
52     tab.ExecuteJavaScript('window.document.getElementById("pause").click();')
53
54     tab.WaitForJavaScriptExpression('!!window.results_', 600)
55
56     self._power_metric.Stop(page, tab)
57     self._power_metric.AddResults(tab, results)
58
59     score = eval(tab.EvaluateJavaScript('window.results_ || "[]"'))
60
61     def Escape(k):
62       chars = [' ', '.', '-', '/', '(', ')', '*']
63       for c in chars:
64         k = k.replace(c, '_')
65       return k
66
67     def AggregateData(container, key, value):
68       if key not in container:
69         container[key] = {'count': 0, 'sum': 0}
70       container[key]['count'] += 1
71       container[key]['sum'] += math.log(value)
72
73     suffix = page.url[page.url.index('?') + 1 :]
74     def AddResult(name, value):
75       important = False
76       if name == suffix:
77         important = True
78       results.AddValue(scalar.ScalarValue(
79           results.current_page, Escape(name), 'runs/s', value, important))
80
81     aggregated = {}
82     for data in score:
83       AddResult('%s/%s' % (data['collection'], data['name']),
84                 data['mean'])
85
86       top_name = data['collection'].split('-', 1)[0]
87       AggregateData(aggregated, top_name, data['mean'])
88
89       collection_name = data['collection']
90       AggregateData(aggregated, collection_name, data['mean'])
91
92     for key, value in aggregated.iteritems():
93       AddResult(key, math.exp(value['sum'] / value['count']))
94
95 class _DromaeoBenchmark(benchmark.Benchmark):
96   """A base class for Dromaeo benchmarks."""
97   test = _DromaeoMeasurement
98
99   def CreatePageSet(self, options):
100     """Makes a PageSet for Dromaeo benchmarks."""
101     # Subclasses are expected to define class members called query_param and
102     # tag.
103     if not hasattr(self, 'query_param') or not hasattr(self, 'tag'):
104       raise NotImplementedError('query_param or tag not in Dromaeo benchmark.')
105     archive_data_file = '../page_sets/data/dromaeo.%s.json' % self.tag
106     ps = page_set.PageSet(
107         make_javascript_deterministic=False,
108         archive_data_file=archive_data_file,
109         file_path=os.path.abspath(__file__))
110     url = 'http://dromaeo.com?%s' % self.query_param
111     ps.AddPageWithDefaultRunNavigate(url)
112     return ps
113
114
115 class DromaeoDomCoreAttr(_DromaeoBenchmark):
116   """Dromaeo DOMCore attr JavaScript benchmark."""
117   tag = 'domcoreattr'
118   query_param = 'dom-attr'
119
120
121 class DromaeoDomCoreModify(_DromaeoBenchmark):
122   """Dromaeo DOMCore modify JavaScript benchmark."""
123   tag = 'domcoremodify'
124   query_param = 'dom-modify'
125
126
127 class DromaeoDomCoreQuery(_DromaeoBenchmark):
128   """Dromaeo DOMCore query JavaScript benchmark."""
129   tag = 'domcorequery'
130   query_param = 'dom-query'
131
132
133 class DromaeoDomCoreTraverse(_DromaeoBenchmark):
134   """Dromaeo DOMCore traverse JavaScript benchmark."""
135   tag = 'domcoretraverse'
136   query_param = 'dom-traverse'
137
138
139 class DromaeoJslibAttrJquery(_DromaeoBenchmark):
140   """Dromaeo JSLib attr jquery JavaScript benchmark"""
141   tag = 'jslibattrjquery'
142   query_param = 'jslib-attr-jquery'
143
144
145 class DromaeoJslibAttrPrototype(_DromaeoBenchmark):
146   """Dromaeo JSLib attr prototype JavaScript benchmark"""
147   tag = 'jslibattrprototype'
148   query_param = 'jslib-attr-prototype'
149
150
151 class DromaeoJslibEventJquery(_DromaeoBenchmark):
152   """Dromaeo JSLib event jquery JavaScript benchmark"""
153   tag = 'jslibeventjquery'
154   query_param = 'jslib-event-jquery'
155
156
157 class DromaeoJslibEventPrototype(_DromaeoBenchmark):
158   """Dromaeo JSLib event prototype JavaScript benchmark"""
159   tag = 'jslibeventprototype'
160   query_param = 'jslib-event-prototype'
161
162
163 @benchmark.Disabled('xp')  # crbug.com/389731
164 class DromaeoJslibModifyJquery(_DromaeoBenchmark):
165   """Dromaeo JSLib modify jquery JavaScript benchmark"""
166   tag = 'jslibmodifyjquery'
167   query_param = 'jslib-modify-jquery'
168
169
170 class DromaeoJslibModifyPrototype(_DromaeoBenchmark):
171   """Dromaeo JSLib modify prototype JavaScript benchmark"""
172   tag = 'jslibmodifyprototype'
173   query_param = 'jslib-modify-prototype'
174
175
176 class DromaeoJslibStyleJquery(_DromaeoBenchmark):
177   """Dromaeo JSLib style jquery JavaScript benchmark"""
178   tag = 'jslibstylejquery'
179   query_param = 'jslib-style-jquery'
180
181
182 class DromaeoJslibStylePrototype(_DromaeoBenchmark):
183   """Dromaeo JSLib style prototype JavaScript benchmark"""
184   tag = 'jslibstyleprototype'
185   query_param = 'jslib-style-prototype'
186
187
188 class DromaeoJslibTraverseJquery(_DromaeoBenchmark):
189   """Dromaeo JSLib traverse jquery JavaScript benchmark"""
190   tag = 'jslibtraversejquery'
191   query_param = 'jslib-traverse-jquery'
192
193
194 class DromaeoJslibTraversePrototype(_DromaeoBenchmark):
195   """Dromaeo JSLib traverse prototype JavaScript benchmark"""
196   tag = 'jslibtraverseprototype'
197   query_param = 'jslib-traverse-prototype'
198
199
200 class DromaeoCSSQueryJquery(_DromaeoBenchmark):
201   """Dromaeo CSS Query jquery JavaScript benchmark"""
202   tag = 'cssqueryjquery'
203   query_param = 'cssquery-jquery'
204