Add more Russian replay performance tests
[WebKit-https.git] / PerformanceTests / inspector / performance-test.js
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 }