158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import json
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import logging
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)from metrics import Metric
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)_COUNTER_NAMES = [
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.OsMemoryAllocated',
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryNewSpaceBytesAvailable',
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryNewSpaceBytesCommitted',
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryNewSpaceBytesUsed',
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryOldPointerSpaceBytesAvailable',
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryOldPointerSpaceBytesCommitted',
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryOldPointerSpaceBytesUsed',
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryOldDataSpaceBytesAvailable',
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryOldDataSpaceBytesCommitted',
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryOldDataSpaceBytesUsed',
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryCodeSpaceBytesAvailable',
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryCodeSpaceBytesCommitted',
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryCodeSpaceBytesUsed',
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryMapSpaceBytesAvailable',
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryMapSpaceBytesCommitted',
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryMapSpaceBytesUsed',
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryCellSpaceBytesAvailable',
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryCellSpaceBytesCommitted',
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryCellSpaceBytesUsed',
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryPropertyCellSpaceBytesAvailable',
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryPropertyCellSpaceBytesCommitted',
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryPropertyCellSpaceBytesUsed',
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryLoSpaceBytesAvailable',
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryLoSpaceBytesCommitted',
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.MemoryLoSpaceBytesUsed',
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ACCESSOR_PAIR_TYPE',
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ACCESS_CHECK_INFO_TYPE',
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ALIASED_ARGUMENTS_ENTRY_TYPE',
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ALLOCATION_MEMENTO_TYPE',
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ALLOCATION_SITE_TYPE',
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ASCII_INTERNALIZED_STRING_TYPE',
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ASCII_STRING_TYPE',
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_BOX_TYPE',
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_BREAK_POINT_INFO_TYPE',
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_BYTE_ARRAY_TYPE',
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CALL_HANDLER_INFO_TYPE',
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CELL_TYPE',
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_CACHE_TYPE',
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE',
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-BINARY_OP_IC',
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-BUILTIN',
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-CALL_IC',
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-COMPARE_IC',
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-COMPARE_NIL_IC',
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-FUNCTION',
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-KEYED_CALL_IC',
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-KEYED_LOAD_IC',
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-KEYED_STORE_IC',
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-LOAD_IC',
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-OPTIMIZED_FUNCTION',
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-REGEXP',
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-STORE_IC',
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-STUB',
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CODE_TYPE-TO_BOOLEAN_IC',
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CONS_ASCII_INTERNALIZED_STRING_TYPE',
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CONS_ASCII_STRING_TYPE',
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CONS_INTERNALIZED_STRING_TYPE',
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_CONS_STRING_TYPE',
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_DEBUG_INFO_TYPE',
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_DECLARED_ACCESSOR_DESCRIPTOR_TYPE',
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_DECLARED_ACCESSOR_INFO_TYPE',
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXECUTABLE_ACCESSOR_INFO_TYPE',
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE',
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_ASCII_STRING_TYPE',
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_BYTE_ARRAY_TYPE',
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_DOUBLE_ARRAY_TYPE',
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_FLOAT_ARRAY_TYPE',
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_INTERNALIZED_STRING_TYPE',
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE',
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_INT_ARRAY_TYPE',
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_PIXEL_ARRAY_TYPE',
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_SHORT_ARRAY_TYPE',
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_STRING_TYPE',
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE',
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE',
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_UNSIGNED_INT_ARRAY_TYPE',
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE',
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FILLER_TYPE',
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-DESCRIPTOR_ARRAY_SUB_TYPE',
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-DICTIONARY_ELEMENTS_SUB_TYPE',
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-DICTIONARY_PROPERTIES_SUB_TYPE',
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-FAST_ELEMENTS_SUB_TYPE',
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-FAST_PROPERTIES_SUB_TYPE',
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-MAP_CODE_CACHE_SUB_TYPE',
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-SCOPE_INFO_SUB_TYPE',
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-STRING_TABLE_SUB_TYPE',
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY-TRANSITION_ARRAY_SUB_TYPE',
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_ARRAY_TYPE',
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FIXED_DOUBLE_ARRAY_TYPE',
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FOREIGN_TYPE',
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FREE_SPACE_TYPE',
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_FUNCTION_TEMPLATE_INFO_TYPE',
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_HEAP_NUMBER_TYPE',
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_INTERCEPTOR_INFO_TYPE',
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_INTERNALIZED_STRING_TYPE',
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_ARRAY_BUFFER_TYPE',
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_ARRAY_TYPE',
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_BUILTINS_OBJECT_TYPE',
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_CONTEXT_EXTENSION_OBJECT_TYPE',
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_DATA_VIEW_TYPE',
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_DATE_TYPE',
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_FUNCTION_PROXY_TYPE',
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_FUNCTION_TYPE',
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_GENERATOR_OBJECT_TYPE',
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_GLOBAL_OBJECT_TYPE',
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_GLOBAL_PROXY_TYPE',
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_MAP_TYPE',
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_MESSAGE_OBJECT_TYPE',
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_MODULE_TYPE',
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_OBJECT_TYPE',
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_PROXY_TYPE',
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_REGEXP_TYPE',
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_SET_TYPE',
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_TYPED_ARRAY_TYPE',
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_VALUE_TYPE',
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_WEAK_MAP_TYPE',
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_JS_WEAK_SET_TYPE',
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_MAP_TYPE',
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_OBJECT_TEMPLATE_INFO_TYPE',
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_ODDBALL_TYPE',
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_POLYMORPHIC_CODE_CACHE_TYPE',
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_PROPERTY_CELL_TYPE',
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SCRIPT_TYPE',
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SHARED_FUNCTION_INFO_TYPE',
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SHORT_EXTERNAL_ASCII_INTERNALIZED_STRING_TYPE',
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SHORT_EXTERNAL_ASCII_STRING_TYPE',
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE',
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE',
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SHORT_EXTERNAL_STRING_TYPE',
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE',
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SIGNATURE_INFO_TYPE',
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SLICED_ASCII_STRING_TYPE',
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SLICED_STRING_TYPE',
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_STRING_TYPE',
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_SYMBOL_TYPE',
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_TYPE_FEEDBACK_INFO_TYPE',
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    'V8.SizeOf_TYPE_SWITCH_INFO_TYPE'
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ]
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class V8ObjectStatsMetric(Metric):
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  """V8ObjectStatsMetric gathers statistics on the size of types in the V8 heap.
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  It does this by enabling the --track_gc_object_stats flag on V8 and reading
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  these statistics from the StatsTableMetric.
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  """
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  def __init__(self):
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    super(V8ObjectStatsMetric, self).__init__()
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self._results = None
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  @classmethod
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  def CustomizeBrowserOptions(cls, options):
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    options.AppendExtraBrowserArgs([
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        '--enable-stats-table',
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        '--enable-benchmarking',
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        '--js-flags=--track_gc_object_stats --expose_gc',
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        # TODO(rmcilroy): This is needed for --enable-stats-table.  Update once
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        # https://codereview.chromium.org/22911027/ lands.
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        '--no-sandbox'
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ])
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  @staticmethod
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  def GetV8StatsTable(tab, counters=None):
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    counters = counters or _COUNTER_NAMES
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return tab.EvaluateJavaScript("""
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     (function(counters) {
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       var results = {};
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       if (!window.chrome || !window.chrome.benchmarking)
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        return results;
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       window.gc();  // Trigger GC to ensure stats are checkpointed.
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       for (var i = 0; i < counters.length; i++)
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         results[counters[i]] =
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)             chrome.benchmarking.counterForRenderer(counters[i]);
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       return results;
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     })(%s);
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)     """ % json.dumps(counters))
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  def Start(self, page, tab):
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    """Do Nothing."""
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    pass
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  def Stop(self, page, tab):
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    """Get the values in the stats table after the page is loaded."""
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    self._results = V8ObjectStatsMetric.GetV8StatsTable(tab)
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if not self._results:
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      logging.warning('No V8 object stats from website: ' + page.display_name)
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  def AddResults(self, tab, results):
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    """Add results for this page to the results object."""
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    assert self._results != None, 'Must call Stop() first'
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for counter_name in self._results:
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      results.Add(counter_name, 'kb', self._results[counter_name] / 1024.0)
204