OLD | NEW |
---|---|
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Runs Chromium's IndexedDB performance test. These test: | 5 """Runs Chromium's IndexedDB performance test. These test: |
6 | 6 |
7 Databases: | 7 Databases: |
8 create/delete | 8 create/delete |
9 Keys: | 9 Keys: |
10 create/delete | 10 create/delete |
11 Indexes: | 11 Indexes: |
12 create/delete | 12 create/delete |
13 Data access: | 13 Data access: |
14 Random read/write | 14 Random read/write |
15 Read cache | 15 Read cache |
16 Cursors: | 16 Cursors: |
17 Read & random writes | 17 Read & random writes |
18 Walking multiple | 18 Walking multiple |
19 Seeking. | 19 Seeking. |
20 """ | 20 """ |
21 | 21 |
22 import json | 22 import json |
23 import os | |
24 | 23 |
25 from core import perf_benchmark | 24 from core import perf_benchmark |
26 | 25 |
27 from telemetry.core import util | |
28 from telemetry import page as page_module | |
29 from telemetry.page import page_test | 26 from telemetry.page import page_test |
30 from telemetry import story | |
31 from telemetry.value import scalar | 27 from telemetry.value import scalar |
32 | 28 |
33 from metrics import memory | 29 from metrics import memory |
34 from metrics import power | 30 from metrics import power |
35 | 31 |
32 import page_sets | |
33 | |
34 from telemetry.timeline import tracing_category_filter | |
35 from telemetry.web_perf import timeline_based_measurement | |
36 | |
37 | |
38 IDB_CATEGORY = 'IndexedDB' | |
39 TIMELINE_REQUIRED_CATEGORY = 'blink.console' | |
36 | 40 |
37 class _IndexedDbMeasurement(page_test.PageTest): | 41 class _IndexedDbMeasurement(page_test.PageTest): |
38 def __init__(self): | 42 def __init__(self): |
39 super(_IndexedDbMeasurement, self).__init__() | 43 super(_IndexedDbMeasurement, self).__init__() |
40 self._memory_metric = None | 44 self._memory_metric = None |
41 self._power_metric = None | 45 self._power_metric = None |
42 | 46 |
43 def WillStartBrowser(self, platform): | 47 def WillStartBrowser(self, platform): |
44 """Initialize metrics once right before the browser has been launched.""" | 48 """Initialize metrics once right before the browser has been launched.""" |
45 self._power_metric = power.PowerMetric(platform) | 49 self._power_metric = power.PowerMetric(platform) |
46 | 50 |
47 def DidStartBrowser(self, browser): | 51 def DidStartBrowser(self, browser): |
48 """Initialize metrics once right after the browser has been launched.""" | 52 """Initialize metrics once right after the browser has been launched.""" |
49 self._memory_metric = memory.MemoryMetric(browser) | 53 self._memory_metric = memory.MemoryMetric(browser) |
50 | 54 |
51 def DidNavigateToPage(self, page, tab): | 55 def DidNavigateToPage(self, page, tab): |
52 self._memory_metric.Start(page, tab) | 56 self._memory_metric.Start(page, tab) |
53 self._power_metric.Start(page, tab) | 57 self._power_metric.Start(page, tab) |
54 | 58 |
55 def ValidateAndMeasurePage(self, page, tab, results): | 59 def ValidateAndMeasurePage(self, page, tab, results): |
56 tab.WaitForDocumentReadyStateToBeComplete() | 60 tab.WaitForDocumentReadyStateToBeComplete() |
57 tab.WaitForJavaScriptExpression( | 61 tab.WaitForJavaScriptExpression('window.done == true', 600) |
cmumford
2015/08/03 17:31:33
Nit: why not just 'window.done'?
dmurph
2015/08/05 15:30:32
ah, true.
| |
58 'window.document.cookie.indexOf("__done=1") >= 0', 600) | |
59 | 62 |
60 self._power_metric.Stop(page, tab) | 63 self._power_metric.Stop(page, tab) |
61 self._memory_metric.Stop(page, tab) | 64 self._memory_metric.Stop(page, tab) |
62 | 65 |
63 self._memory_metric.AddResults(tab, results) | 66 self._memory_metric.AddResults(tab, results) |
64 self._power_metric.AddResults(tab, results) | 67 self._power_metric.AddResults(tab, results) |
65 | 68 |
66 js_get_results = "JSON.stringify(automation.getResults());" | 69 js_get_results = "JSON.stringify(automation.getResults());" |
67 result_dict = json.loads(tab.EvaluateJavaScript(js_get_results)) | 70 result_dict = json.loads(tab.EvaluateJavaScript(js_get_results)) |
68 total = 0.0 | 71 total = 0.0 |
69 for key in result_dict: | 72 for key in result_dict: |
70 if key == 'OverallTestDuration': | 73 if key == 'OverallTestDuration': |
71 continue | 74 continue |
72 msec = float(result_dict[key]) | 75 msec = float(result_dict[key]) |
73 results.AddValue(scalar.ScalarValue( | 76 results.AddValue(scalar.ScalarValue( |
74 results.current_page, key, 'ms', msec, important=False)) | 77 results.current_page, key, 'ms', msec, important=False)) |
75 | 78 |
76 total += msec | 79 total += msec |
77 results.AddValue(scalar.ScalarValue( | 80 results.AddValue(scalar.ScalarValue( |
78 results.current_page, 'Total Perf', 'ms', total)) | 81 results.current_page, 'Total Perf', 'ms', total)) |
79 | 82 |
80 | 83 |
81 def CustomizeBrowserOptions(self, options): | 84 def CustomizeBrowserOptions(self, options): |
82 memory.MemoryMetric.CustomizeBrowserOptions(options) | 85 memory.MemoryMetric.CustomizeBrowserOptions(options) |
83 power.PowerMetric.CustomizeBrowserOptions(options) | 86 power.PowerMetric.CustomizeBrowserOptions(options) |
84 | 87 |
88 | |
85 class IndexedDb(perf_benchmark.PerfBenchmark): | 89 class IndexedDb(perf_benchmark.PerfBenchmark): |
86 """Chromium's IndexedDB Performance tests.""" | 90 """Chromium's IndexedDB Performance tests.""" |
87 test = _IndexedDbMeasurement | 91 test = _IndexedDbMeasurement |
92 page_set = page_sets.IndexedDBEndurePageSet | |
88 | 93 |
89 @classmethod | 94 @classmethod |
90 def Name(cls): | 95 def Name(cls): |
91 return 'indexeddb_perf' | 96 return 'indexeddb_perf' |
92 | 97 |
93 def CreateStorySet(self, options): | 98 |
94 indexeddb_dir = os.path.join(util.GetChromiumSrcDir(), 'chrome', 'test', | 99 class IndexedDbTracing(perf_benchmark.PerfBenchmark): |
95 'data', 'indexeddb') | 100 """IndexedDB Performance tests that use tracing.""" |
96 ps = story.StorySet(base_dir=indexeddb_dir) | 101 page_set = page_sets.IndexedDBEndurePageSet |
97 ps.AddStory(page_module.Page('file://perf_test.html', ps, ps.base_dir)) | 102 |
98 return ps | 103 def CreateTimelineBasedMeasurementOptions(self): |
104 cat_filter = tracing_category_filter.CreateMinimalOverheadFilter() | |
105 cat_filter.AddIncludedCategory(IDB_CATEGORY) | |
106 cat_filter.AddIncludedCategory(TIMELINE_REQUIRED_CATEGORY) | |
107 | |
108 return timeline_based_measurement.Options( | |
109 overhead_level=cat_filter) | |
110 | |
111 @classmethod | |
112 def Name(cls): | |
113 return 'storage.indexeddb' | |
114 | |
115 @classmethod | |
116 def ValueCanBeAddedPredicate(cls, value, is_first_result): | |
117 if 'idb' not in value.name: | |
cmumford
2015/08/03 17:31:34
This logic makes me think way too much. Why not ju
dmurph
2015/08/05 15:30:32
Done.
| |
118 return False | |
119 return True | |
OLD | NEW |