[PerformanceTests] Add landing html for Dromaeo dom-query test
[WebKit-https.git] / PerformanceTests / resources / runner.js
1 function log(text) {
2     document.getElementById("log").innerHTML += text + "\n";
3     window.scrollTo(0, document.body.height);
4 }
5
6 function logInfo(text) {
7     if (!window.layoutTestController)
8         log(text);
9 }
10
11 function loadFile(path) {
12     var xhr = new XMLHttpRequest();
13     xhr.open("GET", path, false);
14     xhr.send(null);
15     return xhr.responseText;
16 }
17
18 var runCount = -1;
19 var runFunction = function() {};
20 var completedRuns = -1; // Discard the any runs < 0.
21 var times = [];
22
23 function computeAverage(values) {
24     var sum = 0;
25     for (var i = 0; i < values.length; i++)
26         sum += values[i];
27     return sum / values.length;
28 }
29
30 function computeMax(values) {
31     var max = values.length ? values[0] : 0;
32     for (var i = 1; i < values.length; i++) {
33         if (max < values[i])
34             max = values[i];
35     }
36     return max;
37 }
38
39 function computeMedian(values) {
40     values.sort(function(a, b) { return a - b; });
41     var len = values.length;
42     if (len % 2)
43         return values[(len-1)/2];
44     return (values[len/2-1] + values[len/2]) / 2;
45 }
46
47 function computeMin(values) {
48     var min = values.length ? values[0] : 0;
49     for (var i = 1; i < values.length; i++) {
50         if (min > values[i])
51             min = values[i];
52     }
53     return min;
54 }
55
56 function computeStdev(values) {
57     var average = computeAverage(values);
58     var sumOfSquaredDeviations = 0;
59     for (var i = 0; i < values.length; ++i) {
60         var deviation = values[i] - average;
61         sumOfSquaredDeviations += deviation * deviation;
62     }
63     return Math.sqrt(sumOfSquaredDeviations / values.length);
64 }
65
66 function printStatistics(stats, printFunction)
67 {
68     printFunction("");
69     printFunction("avg " + stats.avg);
70     printFunction("median " + stats.median);
71     printFunction("stdev " + stats.stdev);
72     printFunction("min " + stats.min);
73     printFunction("max " + stats.max);
74 }
75
76 function logStatistics(times) {
77     printStatistics({
78         avg: computeAverage(times),
79         median: computeMedian(times),
80         stdev: computeStdev(times),
81         min: computeMin(times),
82         max: computeMax(times)
83     }, log);
84 }
85
86 function gc() {
87     if (window.GCController)
88         GCController.collect();
89     else {
90         function gcRec(n) {
91             if (n < 1)
92                 return {};
93             var temp = {i: "ab" + i + (i / 100000)};
94             temp += "foo";
95             gcRec(n-1);
96         }
97         for (var i = 0; i < 1000; i++)
98             gcRec(10);
99     }
100 }
101
102 function runLoop()
103 {
104     if (window.completedRuns < window.runCount) {
105         gc();
106         window.setTimeout(run, 0);
107     } else {
108         logStatistics(times);
109         window.doneFunction();
110         if (window.layoutTestController)
111             layoutTestController.notifyDone();
112     }
113 }
114
115 function run() {
116     if (window.customRunFunction)
117         var time = window.customRunFunction();
118     else {
119         var start = new Date();
120         for (var i = 0; i < window.loopsPerRun; ++i)
121             window.runFunction();
122         var time = new Date() - start;
123     }
124
125     window.completedRuns++;
126     if (window.completedRuns <= 0) {
127         log("Ignoring warm-up run (" + time + ")");
128     } else {
129         times.push(time);
130         log(time);
131     }
132     runLoop()
133 }
134
135 function start(runCount, runFunction, loopsPerRun, doneFunction) {
136     window.runCount = runCount;
137     window.runFunction = runFunction;
138     window.loopsPerRun = loopsPerRun || 10;
139     window.doneFunction = doneFunction || function() {};
140
141     log("Running " + runCount + " times");
142     runLoop();
143 }
144
145 function startCustom(runCount, customRunFunction, doneFunction) {
146     window.runCount = runCount;
147     window.customRunFunction = customRunFunction;
148     window.loopsPerRun = 1;
149     window.doneFunction = doneFunction || function() {};
150
151     log("Running " + runCount + " times");
152     runLoop();
153 }
154
155 if (window.layoutTestController) {
156     layoutTestController.waitUntilDone();
157     layoutTestController.dumpAsText();
158 }