summaryrefslogtreecommitdiff
path: root/platform/node/test/benchmark.js
blob: 50f6353bca8c00ad7704278ecf0464878cfc471a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
'use strict';

var mockfs = require('./mockfs');
var mbgl = require('../index');
var test = require('tape');

var firstRequest = "mapbox://sprites/mapbox/streets-v9@2x.json";

var params = {
    mapPoolSize: 10,
    numRenderings: 1000,
    failurePercentage: 10,
    timeoutPercentage: 10,
    renderingTimeout: 5000,
    ratio: 2
};

test('Benchmark', function(t) {
    console.time('Time');

    var renderCount = 0;
    var failureCount = 0;
    var cancelCount = 0;

    var options = {
        request: function(req, callback) {
            setTimeout(function() {
                var num = Math.floor(Math.random() * 100);

                if (req.url == firstRequest && num < params.failurePercentage) {
                    callback(new Error('Failure'));
                } else if (req.url == firstRequest && num > 99 - params.timeoutPercentage) {
                    setTimeout(function() { callback(new Error('Timeout')); }, params.renderingTimeout * 5);
                } else {
                    var data = mockfs.dataForRequest(req);
                    callback(null, { data: mockfs.dataForRequest(req) });
                }
            }, 0);
        },
        ratio: params.ratio,
    };

    var mapPool = []

    for (var i = 0; i < params.mapPoolSize; ++i) {
        var map = new mbgl.Map(options);
        mapPool.push(map);
    }

    var interval = setInterval(function () {
        if (mapPool.length == 0 || renderCount == params.numRenderings) {
            return;
        }

        var map = mapPool.shift();

        map.load('{ "version": 8, "sources": {}, "layers": [] }');
        map.load(mockfs.style_vector);

        renderCount += 1;

        if (renderCount % (params.numRenderings / 100) == 0) {
            // Print some progress, so slow build bots don't timeout.
            t.comment('Rendering (' + renderCount.toString() +
                '/' + params.numRenderings.toString() + ')');
        }

        if (renderCount == params.numRenderings) {
            clearInterval(interval);
            t.end();
            console.timeEnd('Time');
            console.log('Failures: ' + failureCount);
            console.log('Canceled: ' + cancelCount);

            return;
        }

        var mapTimeout = setTimeout(function() {
            map.cancel();
        }, params.renderingTimeout);

        map.render({ zoom: 16 }, function(err, pixels) {
            clearTimeout(mapTimeout);

            if (err) {
                if (err.message == 'Failure') {
                    failureCount += 1;
                }

                if (err.message == 'Canceled') {
                    cancelCount += 1;
                }

                // We cancel the request before it gets a
                // timeout error from the file source.
                if (err.message == 'Timeout') {
                    t.fail('should never happen');
                }
            }

            mapPool.push(map);
        });
    }, 1);
});