| Index: chrome/browser/resources/profiler/profiler.js
|
| diff --git a/chrome/browser/resources/profiler/profiler.js b/chrome/browser/resources/profiler/profiler.js
|
| index ec573ad57a3f680368aad011973a9979db400f4c..423392e07666c788c5468bc5b29d69ae4d55b25e 100644
|
| --- a/chrome/browser/resources/profiler/profiler.js
|
| +++ b/chrome/browser/resources/profiler/profiler.js
|
| @@ -127,6 +127,17 @@ var MainView = (function() {
|
| var KEY_QUEUE_TIME = END_KEY++;
|
| var KEY_AVG_QUEUE_TIME = END_KEY++;
|
| var KEY_MAX_QUEUE_TIME = END_KEY++;
|
| + if (loadTimeData.getBoolean('enableMemoryTaskProfiler')) {
|
| + var KEY_MEMORY_AVG_ALLOC_OPS = END_KEY++;
|
| + var KEY_MEMORY_AVG_FREE_OPS = END_KEY++;
|
| + var KEY_MEMORY_AVG_NET_BYTES = END_KEY++;
|
| + var KEY_MEMORY_MAX_ALLOCATED_BYTES = END_KEY++;
|
| + var KEY_MEMORY_ALLOC_OPS = END_KEY++;
|
| + var KEY_MEMORY_FREE_OPS = END_KEY++;
|
| + var KEY_MEMORY_ALLOCATED_BYTES = END_KEY++;
|
| + var KEY_MEMORY_FREED_BYTES = END_KEY++;
|
| + var KEY_MEMORY_ALLOC_OVERHEAD_BYTES = END_KEY++;
|
| + }
|
| var KEY_BIRTH_THREAD = END_KEY++;
|
| var KEY_DEATH_THREAD = END_KEY++;
|
| var KEY_PROCESS_TYPE = END_KEY++;
|
| @@ -243,6 +254,47 @@ var MainView = (function() {
|
| })();
|
|
|
| /**
|
| + * This aggregator computes an average by summing the difference of two
|
| + * numeric fields, summing a count, and then dividing the totals.
|
| + */
|
| + var AvgDiffAggregator = (function() {
|
| + function Aggregator(numeratorPosKey, numeratorNegKey, divisorKey) {
|
| + this.numeratorPosKey_ = numeratorPosKey;
|
| + this.numeratorNegKey_ = numeratorNegKey;
|
| + this.divisorKey_ = divisorKey;
|
| +
|
| + this.numeratorSum_ = 0;
|
| + this.divisorSum_ = 0;
|
| + }
|
| +
|
| + Aggregator.prototype = {
|
| + consume: function(e) {
|
| + this.numeratorSum_ +=
|
| + e[this.numeratorPosKey_] - e[this.numeratorNegKey_];
|
| + this.divisorSum_ += e[this.divisorKey_];
|
| + },
|
| +
|
| + getValue: function() {
|
| + return this.numeratorSum_ / this.divisorSum_;
|
| + },
|
| +
|
| + getValueAsText: function() {
|
| + return formatNumberAsText(this.getValue());
|
| + },
|
| + };
|
| +
|
| + return {
|
| + create: function(numeratorPosKey, numeratorNegKey, divisorKey) {
|
| + return {
|
| + create: function(key) {
|
| + return new Aggregator(numeratorPosKey, numeratorNegKey, divisorKey);
|
| + },
|
| + };
|
| + }
|
| + };
|
| + })();
|
| +
|
| + /**
|
| * This aggregator finds the maximum for a numeric field.
|
| */
|
| var MaxAggregator = (function() {
|
| @@ -418,6 +470,93 @@ var MainView = (function() {
|
| diff: diffFuncForCount,
|
| };
|
|
|
| + if (loadTimeData.getBoolean('enableMemoryTaskProfiler')) {
|
| + KEY_PROPERTIES[KEY_MEMORY_AVG_ALLOC_OPS] = {
|
| + name: 'Avg Allocations',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + aggregator: AvgAggregator.create(KEY_MEMORY_ALLOC_OPS, KEY_COUNT),
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_AVG_FREE_OPS] = {
|
| + name: 'Avg Frees',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + aggregator: AvgAggregator.create(KEY_MEMORY_FREE_OPS, KEY_COUNT),
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_AVG_NET_BYTES] = {
|
| + name: 'Avg Net Bytes',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + aggregator: AvgDiffAggregator.create(KEY_MEMORY_ALLOCATED_BYTES,
|
| + KEY_MEMORY_FREED_BYTES, KEY_COUNT),
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_ALLOC_OPS] = {
|
| + name: 'Allocation count',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + inputJsonKey: 'death_data.alloc_ops',
|
| + aggregator: SumAggregator,
|
| + diff: diffFuncForCount,
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_FREE_OPS] = {
|
| + name: 'Free Count',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + inputJsonKey: 'death_data.free_ops',
|
| + aggregator: SumAggregator,
|
| + diff: diffFuncForCount,
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_ALLOCATED_BYTES] = {
|
| + name: 'Allocated bytes',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + inputJsonKey: 'death_data.allocated_bytes',
|
| + aggregator: SumAggregator,
|
| + diff: diffFuncForCount,
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_FREED_BYTES] = {
|
| + name: 'Freed bytes',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + inputJsonKey: 'death_data.freed_bytes',
|
| + aggregator: SumAggregator,
|
| + diff: diffFuncForCount,
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_ALLOC_OVERHEAD_BYTES] = {
|
| + name: 'Overhead bytes',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + inputJsonKey: 'death_data.alloc_overhead_bytes',
|
| + aggregator: SumAggregator,
|
| + diff: diffFuncForCount,
|
| + };
|
| +
|
| + KEY_PROPERTIES[KEY_MEMORY_MAX_ALLOCATED_BYTES] = {
|
| + name: 'Max allocated (outstanding) bytes',
|
| + cellAlignment: 'right',
|
| + sortDescending: true,
|
| + textPrinter: formatNumberAsText,
|
| + inputJsonKey: 'death_data.max_allocated_bytes',
|
| + aggregator: MaxAggregator,
|
| + diff: diffFuncForMax,
|
| + };
|
| + }
|
| +
|
| KEY_PROPERTIES[KEY_AVG_RUN_TIME] = {
|
| name: 'Avg run time',
|
| cellAlignment: 'right',
|
| @@ -482,6 +621,16 @@ var MainView = (function() {
|
| KEY_QUEUE_TIME,
|
| ];
|
|
|
| + if (loadTimeData.getBoolean('enableMemoryTaskProfiler')) {
|
| + INITIALLY_HIDDEN_KEYS = INITIALLY_HIDDEN_KEYS.concat([
|
| + KEY_MEMORY_ALLOC_OPS,
|
| + KEY_MEMORY_FREE_OPS,
|
| + KEY_MEMORY_ALLOCATED_BYTES,
|
| + KEY_MEMORY_FREED_BYTES,
|
| + KEY_MEMORY_ALLOC_OVERHEAD_BYTES,
|
| + ]);
|
| + }
|
| +
|
| /**
|
| * The ordered list of grouping choices to expose in the "Group by"
|
| * dropdowns. We don't include the numeric properties, since they
|
| @@ -825,6 +974,14 @@ var MainView = (function() {
|
| function computeDataRowAverages(e) {
|
| e[KEY_AVG_QUEUE_TIME] = e[KEY_QUEUE_TIME] / e[KEY_COUNT];
|
| e[KEY_AVG_RUN_TIME] = e[KEY_RUN_TIME] / e[KEY_COUNT];
|
| +
|
| + if (loadTimeData.getBoolean('enableMemoryTaskProfiler')) {
|
| + e[KEY_MEMORY_AVG_ALLOC_OPS] = e[KEY_MEMORY_ALLOC_OPS] / e[KEY_COUNT];
|
| + e[KEY_MEMORY_AVG_FREE_OPS] = e[KEY_MEMORY_FREE_OPS] / e[KEY_COUNT];
|
| + e[KEY_MEMORY_AVG_NET_BYTES] =
|
| + (e[KEY_MEMORY_ALLOCATED_BYTES] - e[KEY_MEMORY_FREED_BYTES]) /
|
| + e[KEY_COUNT];
|
| + }
|
| }
|
|
|
| /**
|
| @@ -968,6 +1125,12 @@ var MainView = (function() {
|
| // diffing/aggregating these, but rather will derive them again from the
|
| // final row.
|
| var COMPUTED_AGGREGATE_KEYS = [KEY_AVG_QUEUE_TIME, KEY_AVG_RUN_TIME];
|
| + if (loadTimeData.getBoolean('enableMemoryTaskProfiler')) {
|
| + COMPUTED_AGGREGATE_KEYS = COMPUTED_AGGREGATE_KEYS.concat([
|
| + KEY_MEMORY_AVG_ALLOC_OPS,
|
| + KEY_MEMORY_AVG_FREE_OPS,
|
| + KEY_MEMORY_AVG_NET_BYTES]);
|
| + }
|
|
|
| // These are the keys which determine row equality. Since we are not doing
|
| // any merging yet at this point, it is simply the list of all identity
|
| @@ -1916,7 +2079,7 @@ var MainView = (function() {
|
| for (var i = 0; i < this.snapshots_.length; ++i) {
|
| var checkbox = this.getSnapshotCheckbox_(i);
|
| checkbox.parentNode.parentNode.className =
|
| - checkbox.checked ? 'selected_snapshot' : '';
|
| + checkbox.checked ? 'selected-snapshot' : '';
|
| }
|
| },
|
|
|
|
|