1 var initialize_TimeTracker = function() { 2 3 InspectorTest.runPerformanceTest = function(perfTest, executeTime, callback) 4 { 5 var Timer = function(test, callback) 6 { 7 this._callback = callback; 8 this._test = test; 9 this._times = {}; 10 this._sizes = {}; 11 this._testStartTime = new Date(); 12 this._heapSizeDeltas = []; 13 this._jsHeapSize = this._getJSHeapSize(); 14 } 15 16 Timer.prototype = { 17 start: function(name) 18 { 19 return {name: name, startTime: new Date()}; 20 }, 21 22 finish: function(cookie) 23 { 24 var endTime = new Date(); 25 if (!this._times[cookie.name]) 26 this._times[cookie.name] = []; 27 this._times[cookie.name].push(endTime - cookie.startTime); 28 }, 29 30 reportSize: function(name, size) 31 { 32 if (!this._sizes[name]) 33 this._sizes[name] = []; 34 this._sizes[name].push(size); 35 }, 36 37 _getJSHeapSize: function() 38 { 39 if (window.gc) { 40 window.gc(); 41 window.gc(); 42 } 43 return console.memory.usedJSHeapSize; 44 }, 45 46 done: function(groupName) 47 { 48 var newJSHeapSize = this._getJSHeapSize(); 49 this._heapSizeDeltas.push(newJSHeapSize - this._jsHeapSize); 50 this._jsHeapSize = newJSHeapSize; 51 52 var time = new Date(); 53 if (time - this._testStartTime < executeTime) 54 this._runTest(); 55 else { 56 if (this._complete) 57 return; 58 this._complete = true; 59 60 this._dump(groupName); 61 if (this._callback) 62 this._callback(); 63 else 64 InspectorTest.completeTest(); 65 } 66 }, 67 68 _runTest: function() 69 { 70 if (this._guard) { 71 setTimeout(this._runTest.bind(this), 0); 72 return; 73 } 74 75 this._guard = true; 76 var safeTest = InspectorTest.safeWrap(this._test); 77 safeTest(this); 78 this._guard = false; 79 }, 80 81 _dump: function(groupName) 82 { 83 for (var testName in this._times) 84 InspectorTest.dumpTestStats(groupName, testName, this._times[testName], "ms"); 85 86 for (var testName in this._sizes) 87 InspectorTest.dumpTestStats(groupName, testName, this._sizes[testName], "kB", 1024); 88 89 var url = WebInspector.inspectedPageURL; 90 var regExp = /([^\/]+)\.html/; 91 var matches = regExp.exec(url); 92 InspectorTest.dumpTestStats("heap-delta", matches[1], this._heapSizeDeltas, "kB", 1024); 93 }, 94 } 95 96 InspectorTest.timer = new Timer(perfTest, callback); 97 InspectorTest.timer._runTest(); 98 } 99 100 InspectorTest.measureFunction = function(object, functionName) 101 { 102 function measure() { 103 var timer = InspectorTest.timer; 104 var cookie; 105 if (timer) 106 cookie = timer.start(functionName); 107 var result = func.apply(this, arguments); 108 109 if (timer) 110 timer.finish(cookie); 111 return result; 112 } 113 var func = object[functionName]; 114 object[functionName] = measure; 115 } 116 117 InspectorTest.mark = function(markerName) 118 { 119 var timer = InspectorTest.timer; 120 if (!timer) 121 return; 122 123 if (InspectorTest.lastMarkCookie) 124 timer.finish(InspectorTest.lastMarkCookie); 125 126 InspectorTest.lastMarkCookie = markerName ? timer.start(markerName) : null; 127 } 128 129 InspectorTest.dumpTestStats = function(groupName, testName, samples, units, divider) 130 { 131 divider = divider || 1; 132 var stripNResults = Math.floor(samples.length / 10); 133 samples.sort(function(a, b) { return a - b; }); 134 var sum = 0; 135 for (var i = stripNResults; i < samples.length - stripNResults; ++i) 136 sum += samples[i]; 137 InspectorTest.addResult("RESULT " + groupName + ': ' + testName + "= " + Math.floor(sum / (samples.length - stripNResults * 2) / divider) + " " + units); 138 } 139 140 InspectorTest.addBackendResponseSniffer = function(object, methodName, override, opt_sticky) 141 { 142 var originalMethod = InspectorTest.override(object, methodName, backendCall, opt_sticky); 143 function backendCall() 144 { 145 var args = Array.prototype.slice.call(arguments); 146 var callback = (args.length && typeof args[args.length - 1] === "function") ? args.pop() : 0; 147 args.push(function() { 148 callback.apply(null, arguments); 149 override.apply(null, arguments); 150 }); 151 originalMethod.apply(object, args); 152 } 153 } 154 155 } 156