Index: tools/deep_memory_profiler/visualizer/profiler.js |
diff --git a/tools/deep_memory_profiler/visualizer/profiler.js b/tools/deep_memory_profiler/visualizer/profiler.js |
deleted file mode 100644 |
index 8e311aa3b6916c0cb7999635e785e0e32b2b44fc..0000000000000000000000000000000000000000 |
--- a/tools/deep_memory_profiler/visualizer/profiler.js |
+++ /dev/null |
@@ -1,291 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-/** |
- * This class provides data access interface for dump file profiler. |
- * @constructor |
- */ |
-var Profiler = function(jsonData) { |
- this.jsonData_ = jsonData; |
- // Initialize template with templates information. |
- this.template_ = jsonData.templates['l2']; |
- // Initialize selected category, and nothing selected at first. |
- this.selected_ = null; |
- |
- // Trigger event. |
- this.callbacks_ = {}; |
-}; |
- |
-/** |
- * Mimic Eventemitter in node. Add new listener for event. |
- * @param {string} event |
- * @param {Function} callback |
- */ |
-Profiler.prototype.addListener = function(event, callback) { |
- if (!this.callbacks_[event]) |
- this.callbacks_[event] = $.Callbacks(); |
- this.callbacks_[event].add(callback); |
-}; |
- |
-/** |
- * This function will emit the event. |
- * @param {string} event |
- */ |
-Profiler.prototype.emit = function(event) { |
- // Listeners should be able to receive arbitrary number of parameters. |
- var eventArguments = Array.prototype.slice.call(arguments, 1); |
- |
- if (this.callbacks_[event]) |
- this.callbacks_[event].fire.apply(this, eventArguments); |
-}; |
- |
-/** |
- * Remove listener from event. |
- * @param {string} event |
- * @param {Function} callback |
- */ |
-Profiler.prototype.removeListener = function(event, callback) { |
- if (this.callbacks_[event]) |
- this.callbacks_[event].remove(callback); |
-}; |
- |
-/** |
- * Calcualte initial models according default template. |
- */ |
-Profiler.prototype.reparse = function() { |
- this.models_ = this.parseTemplate_(); |
- this.emit('changed', this.models_); |
-}; |
- |
-/** |
- * To be called by view when new model being selected. |
- * And then triggers all relative views to update. |
- */ |
-Profiler.prototype.setSelected = function(id) { |
- this.selected_ = id; |
- this.emit('changed:selected', id); |
-}; |
- |
-/** |
- * Get all models throughout the whole timeline of given id. |
- * @param {string} id Model id. |
- * @return {Array.<Object>} model array of given id. |
- */ |
-Profiler.prototype.getModelsbyId = function(id) { |
- function find(model) { |
- if (model.id === id) |
- return model; |
- if ('children' in model) |
- return model.children.reduce(function(previous, current) { |
- var matched = find(current); |
- if (matched) |
- previous = matched; |
- return previous; |
- }, null); |
- } |
- |
- return this.models_.reduce(function(previous, current) { |
- var matched = find(current); |
- if (matched) |
- previous.push(matched); |
- return previous; |
- }, []); |
-}; |
- |
-/** |
- * Get current sub of given model, return undefined if sub dont exist. |
- * @param {string} id Model id. |
- * @return {undefined|string} world-breakdown like 'vm-map'. |
- */ |
-Profiler.prototype.getCurSubById = function(id) { |
- // Root won't has breakdown. |
- var path = id.split(',').splice(1); |
- if (!path.length) return null; |
- |
- var tmpl = this.template_; |
- var curSub = path.reduce(function(previous, current, index) { |
- return previous[2][current]; |
- }, tmpl); |
- |
- // return |
- return curSub && curSub[0] + ',' + curSub[1]; |
-}; |
- |
-/** |
- * Generate and then reparse new template when new sub was selected. |
- * @param {string|null} sub World-breakdown like 'vm-map'. |
- */ |
-Profiler.prototype.setSub = function(sub) { |
- var selected = this.selected_; |
- var path = selected.split(','); |
- var key = path[path.length-1]; |
- |
- // Add sub breakdown to template. |
- var models = this.getModelsbyId(selected); |
- var subTmpl = sub.split(','); |
- subTmpl.push({}); |
- models[0].template[2][key] = subTmpl; |
- |
- // Recalculate new template. |
- this.reparse(); |
-}; |
- |
-/** |
- * Calculate the model of certain snapshot. |
- * @param {string} template Local template. |
- * @param {Object} snapshot Current snapshot. |
- * @param {Object} worldUnits Mapping of world units. |
- * @param {Array.<number>} localUnits Array of local units. |
- * @param {string} name Local node path. |
- * @return {Object} Return model, total size and remaining units. |
- * @private |
- */ |
-Profiler.prototype.accumulate_ = function( |
- template, snapshot, worldUnits, localUnits, name) { |
- var self = this; |
- var totalSize = 0; |
- var worldName = template[0]; |
- var breakdownName = template[1]; |
- var categories = snapshot.worlds[worldName].breakdown[breakdownName]; |
- // Make deep copy of localUnits. |
- var remainderUnits = localUnits.slice(0); |
- var model = { |
- name: name || worldName + '-' + breakdownName, |
- children: [] |
- }; |
- |
- Object.keys(categories).forEach(function(categoryName) { |
- var category = categories[categoryName]; |
- if (category['hidden'] === true) |
- return; |
- |
- // Filter units. |
- var matchedUnits = intersection(category.units, localUnits); |
- remainderUnits = difference(remainderUnits, matchedUnits); |
- |
- // Accumulate categories. |
- var size = matchedUnits.reduce(function(previous, current) { |
- return previous + worldUnits[worldName][current]; |
- }, 0); |
- totalSize += size; |
- |
- // Handle subs options if exists. |
- var child = null; |
- if (!(categoryName in template[2])) { |
- // Calculate child for current category. |
- child = { |
- name: categoryName, |
- size: size |
- }; |
- if ('subs' in category && category.subs.length) { |
- child.subs = category.subs; |
- child.template = template; |
- } |
- |
- model.children.push(child); |
- } else { |
- // Calculate child recursively. |
- var subTemplate = template[2][categoryName]; |
- var subWorldName = subTemplate[0]; |
- var retVal = null; |
- |
- if (subWorldName === worldName) { |
- // If subs is in the same world, units should be filtered. |
- retVal = self.accumulate_(subTemplate, snapshot, worldUnits, |
- matchedUnits, categoryName); |
- if ('subs' in category && category.subs.length) { |
- retVal.model.subs = category.subs; |
- retVal.model.template = template; |
- } |
- model.children.push(retVal.model); |
- // Don't output remaining item without any unit. |
- if (!retVal.remainderUnits.length) |
- return; |
- |
- // Sum up remaining units size. |
- var remainSize = |
- retVal.remainderUnits.reduce(function(previous, current) { |
- return previous + worldUnits[subWorldName][current]; |
- }, 0); |
- |
- model.children.push({ |
- name: categoryName + '-remaining', |
- size: remainSize |
- }); |
- } else { |
- // If subs is in different world, use all units in that world. |
- var subLocalUnits = Object.keys(worldUnits[subWorldName]); |
- subLocalUnits = subLocalUnits.map(function(unitID) { |
- return parseInt(unitID, 10); |
- }); |
- |
- retVal = self.accumulate_(subTemplate, snapshot, worldUnits, |
- subLocalUnits, categoryName); |
- if ('subs' in category && category.subs.length) { |
- retVal.model.subs = category.subs; |
- retVal.model.template = template; |
- } |
- model.children.push(retVal.model); |
- |
- if (size > retVal.totalSize) { |
- model.children.push({ |
- name: categoryName + '-remaining', |
- size: size - retVal.totalSize |
- }); |
- } else { |
- // Output WARNING when sub-breakdown size is larger. |
- console.log('WARNING: size of sub-breakdown is larger'); |
- } |
- } |
- } |
- }); |
- |
- return { |
- model: model, |
- totalSize: totalSize, |
- remainderUnits: remainderUnits |
- }; |
-}; |
- |
-/** |
- * Parse template and calculate models of the whole timeline. |
- * @return {Array.<Object>} Models of the whole timeline. |
- * @private |
- */ |
-Profiler.prototype.parseTemplate_ = function() { |
- function calModelId(model, localPath) { |
- // Create unique id for every model. |
- model.id = localPath.length ? |
- localPath.join() + ',' + model.name : model.name; |
- |
- if ('children' in model) { |
- model.children.forEach(function(child, index) { |
- var childPath = localPath.slice(0); |
- childPath.push(model.name); |
- calModelId(child, childPath); |
- }); |
- } |
- } |
- |
- var self = this; |
- |
- return self.jsonData_.snapshots.map(function(snapshot) { |
- var worldUnits = {}; |
- for (var worldName in snapshot.worlds) { |
- worldUnits[worldName] = {}; |
- var units = snapshot.worlds[worldName].units; |
- for (var unitID in units) |
- worldUnits[worldName][unitID] = units[unitID][0]; |
- } |
- var localUnits = Object.keys(worldUnits[self.template_[0]]); |
- localUnits = localUnits.map(function(unitID) { |
- return parseInt(unitID, 10); |
- }); |
- |
- var retVal = |
- self.accumulate_(self.template_, snapshot, worldUnits, localUnits); |
- calModelId(retVal.model, []); |
- return retVal.model; |
- }); |
-}; |