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 205