Skip to content

Commit c99d887

Browse files
committed
combine all tests
1 parent 5d30519 commit c99d887

File tree

13 files changed

+320
-925
lines changed

13 files changed

+320
-925
lines changed

.circleci/config.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,6 @@ jobs:
5353
- run:
5454
name: Run performance tests
5555
command: .circleci/test.sh performance-jasmine
56-
- run:
57-
name: Combine CSV files
58-
command: |
59-
head -n 1 `ls ~/Downloads/*.csv | head -n 1` > ~/Downloads/all.csv
60-
tail -n+2 -q ~/Downloads/*.csv >> ~/Downloads/all.csv
6156
- run:
6257
name: Display system information
6358
command: npm run system-info > ~/Downloads/system_info.txt
Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
var createGraphDiv = require('../assets/create_graph_div');
2+
var delay = require('../assets/delay');
3+
var d3SelectAll = require('../../strict-d3').selectAll;
4+
var Plotly = require('../../../lib/index');
5+
var downloadCSV = require('./assets/post_process').downloadCSV;
6+
var nSamples = require('./assets/constants').nSamples;
7+
8+
var gd = createGraphDiv();
9+
10+
const samples = Array.from({ length: nSamples }, (_, i) => i);
11+
const nTimes = samples.length - 1;
12+
13+
var tests = [];
14+
15+
for(let traceType of ['image', 'heatmap', 'contour']) {
16+
for(let m of [10, 20, 40, 80, 160, 320, 640]) {
17+
let nx = 5 * m;
18+
let ny = 2 * m;
19+
tests.push({
20+
nx: nx,
21+
ny: ny,
22+
n: nx * ny,
23+
nTraces: 1,
24+
traceType: traceType,
25+
selector: traceType === 'image' ? 'g.imagelayer.mlayer' :
26+
'g.' + traceType + 'layer'
27+
});
28+
}
29+
}
30+
31+
for(let traceType of ['box', 'violin']) {
32+
for(let mode of ['no points', 'all points']) {
33+
for(let nTraces of [1, 10, 100]) {
34+
for(let n of [1000, 2000, 4000, 8000, 16000, 32000]) {
35+
tests.push({
36+
n:n,
37+
nTraces: nTraces,
38+
traceType: traceType,
39+
mode: mode,
40+
selector: (
41+
traceType === 'box' ? 'g.trace.boxes' :
42+
traceType === 'violin' ? 'g.trace.violins' :
43+
undefined
44+
)
45+
});
46+
}
47+
}
48+
}
49+
}
50+
51+
for(let traceType of ['scatter', 'scattergl', 'scattergeo']) {
52+
for(let mode of ['markers', 'lines', 'markers+lines']) {
53+
for(let nTraces of [1, 10, 100]) {
54+
for(let n of [1000, 2000, 4000, 8000, 16000, 32000, 64000]) {
55+
tests.push({
56+
n:n,
57+
nTraces: nTraces,
58+
traceType: traceType,
59+
mode: mode,
60+
selector: (
61+
traceType === 'scatter' ? 'g.trace.scatter' :
62+
undefined
63+
)
64+
});
65+
}
66+
}
67+
}
68+
}
69+
70+
for(let traceType of ['bar', 'histogram']) {
71+
for(let mode of ['group', 'stack', 'overlay']) {
72+
for(let nTraces of [1, 10, 100]) {
73+
for(let n of [1000, 2000, 4000, 8000, 16000, 32000]) {
74+
tests.push({
75+
n:n,
76+
nTraces: nTraces,
77+
traceType: traceType,
78+
mode: mode,
79+
selector: 'g.trace.bars'
80+
});
81+
}
82+
}
83+
}
84+
}
85+
86+
function generateMock(spec) {
87+
var type = spec.traceType;
88+
return (
89+
(type === 'image') ? makeImage(spec) :
90+
(type === 'heatmap' || type === 'contour') ? makeHeatmap(spec) :
91+
(type === 'box' || type === 'violin') ? makeBox(spec) :
92+
(type === 'bar' || type === 'histogram') ? makeBar(spec) :
93+
(type === 'scatter' || type === 'scattergl') ? makeScatter(spec) :
94+
(type === 'scattergeo') ? makeScatterGeo(spec) :
95+
{}
96+
);
97+
}
98+
99+
100+
function makeImage(spec) {
101+
var A = spec.nx;
102+
var B = spec.ny;
103+
104+
var x = Array.from({ length: A }, (_, i) => i);
105+
var y = Array.from({ length: B }, (_, i) => i);
106+
var z = [];
107+
for(var k = 0; k < B ; k++) {
108+
z[k] = [];
109+
for(var i = 0; i < A ; i++) {
110+
z[k][i] = [
111+
Math.floor(127 * (1 + Math.cos(Math.sqrt(i)))),
112+
0,
113+
Math.floor(127 * (1 + Math.cos(Math.sqrt(k)))),
114+
];
115+
}
116+
}
117+
118+
return {
119+
data: [{
120+
type: 'image',
121+
x: x,
122+
y: y,
123+
z: z
124+
}],
125+
layout: {
126+
width: 900,
127+
height: 400
128+
}
129+
};
130+
}
131+
132+
function makeHeatmap(spec) {
133+
var A = spec.nx;
134+
var B = spec.ny;
135+
136+
var x = Array.from({ length: A }, (_, i) => i);
137+
var y = Array.from({ length: B }, (_, i) => i);
138+
var z = [];
139+
for(var k = 0; k < B ; k++) {
140+
z[k] = Array.from({ length: A }, (_, i) => k * Math.cos(Math.sqrt(i)));
141+
}
142+
143+
return {
144+
data: [{
145+
type: spec.traceType,
146+
x: x,
147+
y: y,
148+
z: z
149+
}],
150+
layout: {
151+
width: 900,
152+
height: 400
153+
}
154+
};
155+
}
156+
157+
function makeBox(spec) {
158+
var y = Array.from({ length: spec.n }, (_, i) => i * Math.cos(Math.sqrt(i)));
159+
var data = [];
160+
var nPerTrace = Math.floor(spec.n / spec.nTraces);
161+
for(var k = 0; k < spec.nTraces; k++) {
162+
var trace = {
163+
type: spec.traceType,
164+
boxpoints: spec.mode === 'all points' ? 'all' : false,
165+
y: y.slice(k * nPerTrace, (k + 1) * nPerTrace),
166+
x: Array.from({ length: nPerTrace }, (_, i) => k)
167+
};
168+
169+
if(spec.traceType === 'box') {
170+
trace.boxpoints = spec.mode === 'all points' ? 'all' : false;
171+
}
172+
173+
if(spec.traceType === 'violin') {
174+
trace.points = spec.mode === 'all points' ? 'all' : false;
175+
}
176+
177+
data.push(trace);
178+
}
179+
180+
return {
181+
data: data,
182+
layout: {
183+
showlegend: false,
184+
width: 900,
185+
height: 400
186+
}
187+
};
188+
}
189+
190+
function makeBar(spec) {
191+
var z = Array.from({ length: spec.n }, (_, i) => i * Math.cos(Math.sqrt(i)));
192+
var data = [];
193+
var nPerTrace = Math.floor(spec.n / spec.nTraces);
194+
for(var k = 0; k < spec.nTraces; k++) {
195+
if(spec.traceType === 'bar') {
196+
data.push({
197+
type: 'bar',
198+
y: z.slice(k * nPerTrace, (k + 1) * nPerTrace),
199+
x: Array.from({ length: nPerTrace }, (_, i) => i)
200+
});
201+
} else if(spec.traceType === 'histogram') {
202+
data.push({
203+
type: 'histogram',
204+
x: z.slice(k * nPerTrace, (k + 1) * nPerTrace),
205+
y: Array.from({ length: nPerTrace }, (_, i) => i)
206+
});
207+
}
208+
}
209+
210+
return {
211+
data: data,
212+
layout: {
213+
barmode: spec.mode,
214+
showlegend: false,
215+
width: 900,
216+
height: 400
217+
}
218+
};
219+
}
220+
221+
function makeScatter(spec) {
222+
var y = Array.from({ length: spec.n }, (_, i) => i * Math.cos(Math.sqrt(i)));
223+
var data = [];
224+
var nPerTrace = Math.floor(spec.n / spec.nTraces);
225+
for(var k = 0; k < spec.nTraces; k++) {
226+
data.push({
227+
type: spec.traceType,
228+
mode: spec.mode,
229+
y: y.slice(k * nPerTrace, (k + 1) * nPerTrace),
230+
x: Array.from({ length: nPerTrace }, (_, i) => i + k * nPerTrace)
231+
});
232+
}
233+
234+
return {
235+
data: data,
236+
layout: {
237+
showlegend: false,
238+
width: 900,
239+
height: 400
240+
}
241+
};
242+
}
243+
244+
function makeScatterGeo(spec) {
245+
var y = Array.from({ length: spec.n }, (_, i) => 0.001 * i * Math.cos(Math.sqrt(i)));
246+
247+
var data = [];
248+
var nPerTrace = Math.floor(spec.n / spec.nTraces);
249+
for(var k = 0; k < spec.nTraces; k++) {
250+
data.push({
251+
type: 'scattergeo',
252+
mode: spec.mode,
253+
lat: y.slice(k * nPerTrace, (k + 1) * nPerTrace),
254+
lon: Array.from({ length: nPerTrace }, (_, i) => -180 + 0.005 * (i + k * nPerTrace))
255+
});
256+
}
257+
258+
return {
259+
data: data,
260+
layout: {
261+
showlegend: false,
262+
width: 900,
263+
height: 400
264+
}
265+
};
266+
}
267+
268+
269+
tests.forEach(function(spec, index) {
270+
describe('Performance test ' + spec.nTraces + ' ' + spec.traceType + ' | mode: ' + spec.mode + ' | size:' + spec.n, function() {
271+
'use strict';
272+
273+
var startTime, endTime;
274+
275+
beforeEach(function(done) {
276+
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
277+
278+
var mock = generateMock(spec);
279+
280+
startTime = performance.now();
281+
282+
// Wait for actual rendering to complete
283+
requestAnimationFrame(function() {
284+
requestAnimationFrame(function() {
285+
endTime = performance.now();
286+
done();
287+
});
288+
});
289+
290+
Plotly.newPlot(gd, mock);
291+
});
292+
293+
afterEach(function(done) {
294+
delay(100)().then(done);
295+
});
296+
297+
samples.forEach(function(t) {
298+
it('turn: ' + t, function() {
299+
var delta = endTime - startTime;
300+
301+
if(t === 0) {
302+
tests[index].raw = [];
303+
}
304+
tests[index].raw[t] = delta;
305+
306+
if(spec.selector) {
307+
var nodes = d3SelectAll(spec.selector);
308+
expect(nodes.size()).toEqual(spec.nTraces);
309+
}
310+
311+
if(t === nTimes && index === tests.length - 1) {
312+
downloadCSV(tests);
313+
}
314+
});
315+
});
316+
});
317+
});

test/jasmine/performance_tests/assets/post_process.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
exports.downloadCSV = function(traceName, allTests) {
1+
exports.downloadCSV = function(allTests) {
22
var str = [
33
'number of traces',
44
'chart type',
@@ -12,7 +12,7 @@ exports.downloadCSV = function(traceName, allTests) {
1212
for(var i = 0; i < test.raw.length; i++) {
1313
str += [
1414
(test.nTraces || 1),
15-
(traceName + (test.mode ? ' ' + test.mode : '')),
15+
(test.traceType + (test.mode ? ' ' + test.mode : '')),
1616
test.n,
1717
i,
1818
test.raw[i]
@@ -25,7 +25,7 @@ exports.downloadCSV = function(traceName, allTests) {
2525
var myBlob = new Blob([str], {type: 'text/plain'})
2626
var url = window.URL.createObjectURL(myBlob);
2727
a.href = url;
28-
a.download = traceName + '.csv';
28+
a.download = 'all.csv';
2929
a.style.display = 'none';
3030
document.body.append(a);
3131
a.click();

0 commit comments

Comments
 (0)