Commit | Line | Data |
---|---|---|
c3fa4a74 DV |
1 | // dygraphs command-line performance benchmark. |
2 | // | |
3 | // Invoke as: | |
4 | // | |
5 | // phantomjs phantom-perf.js 1000 100 5 | |
6 | // | |
7 | // If the test succeeds, it will print out something like: | |
8 | // | |
9 | // 1000/100/5: 1309.4+/-43.4 ms (1284, 1245, 1336, 1346, 1336) | |
10 | // | |
11 | // This is mean +/- standard deviation, followed by a list of the individual | |
12 | // times for each repetition, in milliseconds. | |
13 | ||
14 | var system = require('system'), | |
15 | fs = require('fs'); | |
16 | ||
17 | var tmpfile = "tmp-dygraph-test-params.js"; | |
18 | var url = 'tests/dygraph-many-points-benchmark.html'; | |
19 | ||
20 | function fail(msg){ | |
21 | console.warn(msg); | |
22 | phantom.exit(1); | |
23 | } | |
24 | ||
25 | function assert(condition, msg){ | |
26 | if (condition) return; | |
27 | fail(msg); | |
28 | } | |
29 | ||
30 | var config_file_template = | |
31 | "document.getElementById('points').value = (points);\n" + | |
32 | "document.getElementById('series').value = (series);\n" + | |
33 | "document.getElementById('repetitions').value = (repetitions);\n"; | |
34 | ||
35 | var RunBenchmark = function(points, series, repetitions, done_callback) { | |
36 | var page = require('webpage').create(); | |
37 | ||
38 | // page.evalute() is seriously locked down. | |
39 | // This was the only way I could find to pass the parameters to the page. | |
40 | fs.write(tmpfile, | |
41 | config_file_template | |
42 | .replace("(points)", points) | |
43 | .replace("(series)", series) | |
44 | .replace("(repetitions)", repetitions), | |
45 | "w"); | |
46 | ||
47 | page.open(url, function(status) { | |
48 | if (status !== 'success') { | |
49 | console.warn('Page status: ' + status); | |
50 | console.log(page); | |
51 | phantom.exit(); | |
52 | } | |
53 | ||
54 | assert(page.injectJs(tmpfile), "Unable to inject JS."); | |
55 | fs.remove(tmpfile); | |
56 | ||
57 | var start = new Date().getTime(); | |
58 | var rep_times = page.evaluate(function() { | |
59 | var rep_times = updatePlot(); | |
60 | return rep_times; | |
61 | }); | |
62 | var end = new Date().getTime(); | |
63 | var elapsed = (end - start) / 1000; | |
64 | done_callback(rep_times); | |
65 | }); | |
66 | }; | |
67 | ||
68 | ||
69 | var points, series, repetitions; | |
70 | if (4 != system.args.length) { | |
71 | console.warn('Usage: phantomjs phantom-driver.js (points) (series) (repititions)'); | |
72 | phantom.exit(); | |
73 | } | |
74 | ||
75 | points = parseInt(system.args[1]); | |
76 | series = parseInt(system.args[2]); | |
77 | repetitions = parseInt(system.args[3]); | |
78 | assert(points != null, "Couldn't parse " + system.args[1]); | |
79 | assert(series != null, "Couldn't parse " + system.args[2]); | |
80 | assert(repetitions != null, "Couldn't parse " + system.args[3]); | |
81 | ||
82 | ||
83 | RunBenchmark(points, series, repetitions, function(rep_times) { | |
84 | var mean = 0.0, std = 0.0; | |
85 | rep_times.forEach(function(x) { mean += x; } ); | |
86 | mean /= rep_times.length; | |
87 | rep_times.forEach(function(x) { std += Math.pow(x - mean, 2); }); | |
88 | std = Math.sqrt(std / (rep_times.length - 1)); | |
89 | ||
90 | console.log(points + '/' + series + '/' + repetitions + ': ' + | |
91 | mean.toFixed(1) + '+/-' + std.toFixed(1) + ' ms (' + | |
92 | rep_times.join(', ') + ')'); | |
93 | phantom.exit(); | |
94 | }); |