startup.py revision 58537e28ecd584eab876aee8be7156509866d23a
1c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import json 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from telemetry.page import page_measurement 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochclass Startup(page_measurement.PageMeasurement): 10c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch """Performs a measurement of Chromium's startup performance. 11c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 12c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch This test must be invoked with either --warm or --cold on the command line. A 13c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch cold start means none of the Chromium files are in the disk cache. A warm 14c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch start assumes the OS has already cached much of Chromium's content. For warm 15c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch tests, you should repeat the page set to ensure it's cached. 16c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch """ 179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) HISTOGRAMS_TO_RECORD = { 19b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 'messageloop_start_time' : 20b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 'Startup.BrowserMessageLoopStartTimeFromMainEntry', 21b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 'window_display_time' : 'Startup.BrowserWindowDisplay', 22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 'open_tabs_time' : 'Startup.BrowserOpenTabs'} 23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def __init__(self): 25c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch super(Startup, self).__init__(needs_browser_restart_after_each_run=True) 26c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 27c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch def AddCommandLineOptions(self, parser): 28c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch parser.add_option('--cold', action='store_true', 29c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch help='Clear the OS disk cache before performing the test') 30c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch parser.add_option('--warm', action='store_true', 31c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch help='Start up with everything already cached') 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def CustomizeBrowserOptions(self, options): 34c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch # TODO: Once the bots start running benchmarks, enforce that either --warm 35c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch # or --cold is explicitly specified. 36c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch # assert options.warm != options.cold, \ 37c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch # "You must specify either --warm or --cold" 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if options.cold: 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser_options = options.browser_options 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser_options.clear_sytem_cache_for_browser_and_profile_on_start = True 41c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch else: 42c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch self.discard_first_result = True 43c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) options.AppendExtraBrowserArgs([ 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) '--enable-stats-collection-bindings', 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) # Old commandline flags used for reference builds. 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) '--dom-automation', 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) '--reduce-security-for-dom-automation-tests' 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ]) 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) def MeasurePage(self, page, tab, results): 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) # TODO(jeremy): Remove references to 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) # domAutomationController.getBrowserHistogram when we update the reference 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) # builds. 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) get_histogram_js = ('(window.statsCollectionController ?' 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 'statsCollectionController :' 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 'domAutomationController).getBrowserHistogram("%s")') 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for display_name, histogram_name in self.HISTOGRAMS_TO_RECORD.iteritems(): 61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) result = tab.EvaluateJavaScript(get_histogram_js % histogram_name) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result = json.loads(result) 63b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) measured_time = 0 64b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if 'sum' in result: 66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) # For all the histograms logged here, there's a single entry so sum 67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) # is the exact value for that entry. 68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) measured_time = result['sum'] 69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) elif 'buckets' in result: 70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) measured_time = \ 71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (result['buckets'][0]['high'] + result['buckets'][0]['low']) / 2 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) results.Add(display_name, 'ms', measured_time) 74