PageRenderTime 27ms CodeModel.GetById 2ms RepoModel.GetById 1ms app.codeStats 0ms

/tools/perf/benchmarks/dromaeo.py

https://gitlab.com/jonnialva90/iridium-browser
Python | 335 lines | 181 code | 69 blank | 85 comment | 7 complexity | 2a1129dba1959e1fab33f00a9eab2815 MD5 | raw file
  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. import math
  5. import os
  6. from core import perf_benchmark
  7. from telemetry import benchmark
  8. from telemetry import page as page_module
  9. from telemetry.page import page_test
  10. from telemetry import story
  11. from telemetry.value import scalar
  12. from metrics import power
  13. class _DromaeoMeasurement(page_test.PageTest):
  14. def __init__(self):
  15. super(_DromaeoMeasurement, self).__init__()
  16. self._power_metric = None
  17. def CustomizeBrowserOptions(self, options):
  18. power.PowerMetric.CustomizeBrowserOptions(options)
  19. def WillStartBrowser(self, platform):
  20. self._power_metric = power.PowerMetric(platform)
  21. def DidNavigateToPage(self, page, tab):
  22. self._power_metric.Start(page, tab)
  23. def ValidateAndMeasurePage(self, page, tab, results):
  24. tab.WaitForJavaScriptExpression(
  25. 'window.document.getElementById("pause") &&' +
  26. 'window.document.getElementById("pause").value == "Run"',
  27. 120)
  28. # Start spying on POST request that will report benchmark results, and
  29. # intercept result data.
  30. tab.ExecuteJavaScript('(function() {' +
  31. ' var real_jquery_ajax_ = window.jQuery;' +
  32. ' window.results_ = "";' +
  33. ' window.jQuery.ajax = function(request) {' +
  34. ' if (request.url == "store.php") {' +
  35. ' window.results_ =' +
  36. ' decodeURIComponent(request.data);' +
  37. ' window.results_ = window.results_.substring(' +
  38. ' window.results_.indexOf("=") + 1, ' +
  39. ' window.results_.lastIndexOf("&"));' +
  40. ' real_jquery_ajax_(request);' +
  41. ' }' +
  42. ' };' +
  43. '})();')
  44. # Starts benchmark.
  45. tab.ExecuteJavaScript('window.document.getElementById("pause").click();')
  46. tab.WaitForJavaScriptExpression('!!window.results_', 600)
  47. self._power_metric.Stop(page, tab)
  48. self._power_metric.AddResults(tab, results)
  49. score = eval(tab.EvaluateJavaScript('window.results_ || "[]"'))
  50. def Escape(k):
  51. chars = [' ', '.', '-', '/', '(', ')', '*']
  52. for c in chars:
  53. k = k.replace(c, '_')
  54. return k
  55. def AggregateData(container, key, value):
  56. if key not in container:
  57. container[key] = {'count': 0, 'sum': 0}
  58. container[key]['count'] += 1
  59. container[key]['sum'] += math.log(value)
  60. suffix = page.url[page.url.index('?') + 1 :]
  61. def AddResult(name, value):
  62. important = False
  63. if name == suffix:
  64. important = True
  65. results.AddValue(scalar.ScalarValue(
  66. results.current_page, Escape(name), 'runs/s', value, important))
  67. aggregated = {}
  68. for data in score:
  69. AddResult('%s/%s' % (data['collection'], data['name']),
  70. data['mean'])
  71. top_name = data['collection'].split('-', 1)[0]
  72. AggregateData(aggregated, top_name, data['mean'])
  73. collection_name = data['collection']
  74. AggregateData(aggregated, collection_name, data['mean'])
  75. for key, value in aggregated.iteritems():
  76. AddResult(key, math.exp(value['sum'] / value['count']))
  77. class _DromaeoBenchmark(perf_benchmark.PerfBenchmark):
  78. """A base class for Dromaeo benchmarks."""
  79. test = _DromaeoMeasurement
  80. @classmethod
  81. def Name(cls):
  82. return 'dromaeo'
  83. def CreateStorySet(self, options):
  84. """Makes a PageSet for Dromaeo benchmarks."""
  85. # Subclasses are expected to define class members called query_param and
  86. # tag.
  87. if not hasattr(self, 'query_param') or not hasattr(self, 'tag'):
  88. raise NotImplementedError('query_param or tag not in Dromaeo benchmark.')
  89. archive_data_file = '../page_sets/data/dromaeo.%s.json' % self.tag
  90. ps = story.StorySet(
  91. archive_data_file=archive_data_file,
  92. base_dir=os.path.dirname(os.path.abspath(__file__)),
  93. cloud_storage_bucket=story.PUBLIC_BUCKET)
  94. url = 'http://dromaeo.com?%s' % self.query_param
  95. ps.AddStory(page_module.Page(
  96. url, ps, ps.base_dir, make_javascript_deterministic=False))
  97. return ps
  98. class DromaeoDomCoreAttr(_DromaeoBenchmark):
  99. """Dromaeo DOMCore attr JavaScript benchmark.
  100. Tests setting and getting DOM node attributes.
  101. """
  102. tag = 'domcoreattr'
  103. query_param = 'dom-attr'
  104. @classmethod
  105. def Name(cls):
  106. return 'dromaeo.domcoreattr'
  107. @benchmark.Disabled('xp') # crbug.com/501625
  108. class DromaeoDomCoreModify(_DromaeoBenchmark):
  109. """Dromaeo DOMCore modify JavaScript benchmark.
  110. Tests creating and injecting DOM nodes.
  111. """
  112. tag = 'domcoremodify'
  113. query_param = 'dom-modify'
  114. @classmethod
  115. def Name(cls):
  116. return 'dromaeo.domcoremodify'
  117. class DromaeoDomCoreQuery(_DromaeoBenchmark):
  118. """Dromaeo DOMCore query JavaScript benchmark.
  119. Tests querying DOM elements in a document.
  120. """
  121. tag = 'domcorequery'
  122. query_param = 'dom-query'
  123. @classmethod
  124. def Name(cls):
  125. return 'dromaeo.domcorequery'
  126. class DromaeoDomCoreTraverse(_DromaeoBenchmark):
  127. """Dromaeo DOMCore traverse JavaScript benchmark.
  128. Tests traversing a DOM structure.
  129. """
  130. tag = 'domcoretraverse'
  131. query_param = 'dom-traverse'
  132. @classmethod
  133. def Name(cls):
  134. return 'dromaeo.domcoretraverse'
  135. @benchmark.Disabled('win') # crbug.com/523276
  136. class DromaeoJslibAttrJquery(_DromaeoBenchmark):
  137. """Dromaeo JSLib attr jquery JavaScript benchmark.
  138. Tests setting and getting DOM node attributes using the jQuery JavaScript
  139. Library.
  140. """
  141. tag = 'jslibattrjquery'
  142. query_param = 'jslib-attr-jquery'
  143. @classmethod
  144. def Name(cls):
  145. return 'dromaeo.jslibattrjquery'
  146. class DromaeoJslibAttrPrototype(_DromaeoBenchmark):
  147. """Dromaeo JSLib attr prototype JavaScript benchmark.
  148. Tests setting and getting DOM node attributes using the jQuery JavaScript
  149. Library.
  150. """
  151. tag = 'jslibattrprototype'
  152. query_param = 'jslib-attr-prototype'
  153. @classmethod
  154. def Name(cls):
  155. return 'dromaeo.jslibattrprototype'
  156. @benchmark.Disabled('win') # crbug.com/523276
  157. class DromaeoJslibEventJquery(_DromaeoBenchmark):
  158. """Dromaeo JSLib event jquery JavaScript benchmark.
  159. Tests binding, removing, and triggering DOM events using the jQuery JavaScript
  160. Library.
  161. """
  162. tag = 'jslibeventjquery'
  163. query_param = 'jslib-event-jquery'
  164. @classmethod
  165. def Name(cls):
  166. return 'dromaeo.jslibeventjquery'
  167. class DromaeoJslibEventPrototype(_DromaeoBenchmark):
  168. """Dromaeo JSLib event prototype JavaScript benchmark.
  169. Tests binding, removing, and triggering DOM events using the Prototype
  170. JavaScript Library.
  171. """
  172. tag = 'jslibeventprototype'
  173. query_param = 'jslib-event-prototype'
  174. @classmethod
  175. def Name(cls):
  176. return 'dromaeo.jslibeventprototype'
  177. # xp: crbug.com/389731
  178. # win7: http://crbug.com/479796
  179. # linux: http://crbug.com/513853
  180. # android: http://crbug.com/503138
  181. # win8: crbug.com/529330
  182. @benchmark.Disabled('xp', 'win7', 'linux', 'android', 'win8')
  183. class DromaeoJslibModifyJquery(_DromaeoBenchmark):
  184. """Dromaeo JSLib modify jquery JavaScript benchmark.
  185. Tests creating and injecting DOM nodes into a document using the jQuery
  186. JavaScript Library.
  187. """
  188. tag = 'jslibmodifyjquery'
  189. query_param = 'jslib-modify-jquery'
  190. @classmethod
  191. def Name(cls):
  192. return 'dromaeo.jslibmodifyjquery'
  193. class DromaeoJslibModifyPrototype(_DromaeoBenchmark):
  194. """Dromaeo JSLib modify prototype JavaScript benchmark.
  195. Tests creating and injecting DOM nodes into a document using the Prototype
  196. JavaScript Library.
  197. """
  198. tag = 'jslibmodifyprototype'
  199. query_param = 'jslib-modify-prototype'
  200. @classmethod
  201. def Name(cls):
  202. return 'dromaeo.jslibmodifyprototype'
  203. class DromaeoJslibStyleJquery(_DromaeoBenchmark):
  204. """Dromaeo JSLib style jquery JavaScript benchmark.
  205. Tests getting and setting CSS information on DOM elements using the jQuery
  206. JavaScript Library.
  207. """
  208. tag = 'jslibstylejquery'
  209. query_param = 'jslib-style-jquery'
  210. @classmethod
  211. def Name(cls):
  212. return 'dromaeo.jslibstylejquery'
  213. class DromaeoJslibStylePrototype(_DromaeoBenchmark):
  214. """Dromaeo JSLib style prototype JavaScript benchmark.
  215. Tests getting and setting CSS information on DOM elements using the jQuery
  216. JavaScript Library.
  217. """
  218. tag = 'jslibstyleprototype'
  219. query_param = 'jslib-style-prototype'
  220. @classmethod
  221. def Name(cls):
  222. return 'dromaeo.jslibstyleprototype'
  223. class DromaeoJslibTraverseJquery(_DromaeoBenchmark):
  224. """Dromaeo JSLib traverse jquery JavaScript benchmark.
  225. Tests getting and setting CSS information on DOM elements using the Prototype
  226. JavaScript Library.
  227. """
  228. tag = 'jslibtraversejquery'
  229. query_param = 'jslib-traverse-jquery'
  230. @classmethod
  231. def Name(cls):
  232. return 'dromaeo.jslibtraversejquery'
  233. class DromaeoJslibTraversePrototype(_DromaeoBenchmark):
  234. """Dromaeo JSLib traverse prototype JavaScript benchmark.
  235. Tests traversing a DOM structure using the jQuery JavaScript Library.
  236. """
  237. tag = 'jslibtraverseprototype'
  238. query_param = 'jslib-traverse-prototype'
  239. @classmethod
  240. def Name(cls):
  241. return 'dromaeo.jslibtraverseprototype'
  242. class DromaeoCSSQueryJquery(_DromaeoBenchmark):
  243. """Dromaeo CSS Query jquery JavaScript benchmark.
  244. Tests traversing a DOM structure using the Prototype JavaScript Library.
  245. """
  246. tag = 'cssqueryjquery'
  247. query_param = 'cssquery-jquery'
  248. @classmethod
  249. def Name(cls):
  250. return 'dromaeo.cssqueryjquery'