xref: /aosp_15_r20/external/skia/modules/pathkit/perf/perfReporter.js (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Workerconst REPORT_URL = 'http://localhost:8081/report_perf_data'
2*c8dee2aaSAndroid Build Coastguard Worker// Set this to enforce that the perf server must be up.
3*c8dee2aaSAndroid Build Coastguard Worker// Typically used for debugging.
4*c8dee2aaSAndroid Build Coastguard Workerconst fail_on_no_perf = false;
5*c8dee2aaSAndroid Build Coastguard Worker
6*c8dee2aaSAndroid Build Coastguard Workerfunction benchmarkAndReport(benchName, setupFn, testFn, teardownFn) {
7*c8dee2aaSAndroid Build Coastguard Worker    try {
8*c8dee2aaSAndroid Build Coastguard Worker        let ctx = {};
9*c8dee2aaSAndroid Build Coastguard Worker        // warmup 3 times (arbitrary choice)
10*c8dee2aaSAndroid Build Coastguard Worker        setupFn(ctx);
11*c8dee2aaSAndroid Build Coastguard Worker        testFn(ctx);
12*c8dee2aaSAndroid Build Coastguard Worker        testFn(ctx);
13*c8dee2aaSAndroid Build Coastguard Worker        testFn(ctx);
14*c8dee2aaSAndroid Build Coastguard Worker        teardownFn(ctx);
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker        ctx = {};
17*c8dee2aaSAndroid Build Coastguard Worker        setupFn(ctx);
18*c8dee2aaSAndroid Build Coastguard Worker        let start = Date.now();
19*c8dee2aaSAndroid Build Coastguard Worker        let now = start;
20*c8dee2aaSAndroid Build Coastguard Worker        times = 0;
21*c8dee2aaSAndroid Build Coastguard Worker        // See how many times we can do it in 100ms (arbitrary choice)
22*c8dee2aaSAndroid Build Coastguard Worker        while (now - start < 100) {
23*c8dee2aaSAndroid Build Coastguard Worker            testFn(ctx);
24*c8dee2aaSAndroid Build Coastguard Worker            now = Date.now();
25*c8dee2aaSAndroid Build Coastguard Worker            times++;
26*c8dee2aaSAndroid Build Coastguard Worker        }
27*c8dee2aaSAndroid Build Coastguard Worker
28*c8dee2aaSAndroid Build Coastguard Worker        teardownFn(ctx);
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker        // Try to make it go for 2 seconds (arbitrarily chosen)
31*c8dee2aaSAndroid Build Coastguard Worker        // Since the pre-try took 100ms, multiply by 20 to get
32*c8dee2aaSAndroid Build Coastguard Worker        // approximate tries in 2s (unless now - start >> 100 ms)
33*c8dee2aaSAndroid Build Coastguard Worker        let goalTimes = times * 20;
34*c8dee2aaSAndroid Build Coastguard Worker        ctx = {};
35*c8dee2aaSAndroid Build Coastguard Worker        setupFn(ctx);
36*c8dee2aaSAndroid Build Coastguard Worker        times = 0;
37*c8dee2aaSAndroid Build Coastguard Worker        start = Date.now();
38*c8dee2aaSAndroid Build Coastguard Worker        while (times < goalTimes) {
39*c8dee2aaSAndroid Build Coastguard Worker            testFn(ctx);
40*c8dee2aaSAndroid Build Coastguard Worker            times++;
41*c8dee2aaSAndroid Build Coastguard Worker        }
42*c8dee2aaSAndroid Build Coastguard Worker        const end = Date.now();
43*c8dee2aaSAndroid Build Coastguard Worker        teardownFn(ctx);
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker        const us = (end - start) * 1000 / times;
46*c8dee2aaSAndroid Build Coastguard Worker        console.log(benchName, `${us} microseconds`)
47*c8dee2aaSAndroid Build Coastguard Worker        return _report(us, benchName);
48*c8dee2aaSAndroid Build Coastguard Worker    } catch(e) {
49*c8dee2aaSAndroid Build Coastguard Worker        console.error('caught error', e);
50*c8dee2aaSAndroid Build Coastguard Worker        return Promise.reject(e);
51*c8dee2aaSAndroid Build Coastguard Worker    }
52*c8dee2aaSAndroid Build Coastguard Worker}
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Worker// The same as benchmarkAndReport, except expects the third parameter, testFn, to return a promise
55*c8dee2aaSAndroid Build Coastguard Workerasync function asyncBenchmarkAndReport(benchName, setupFn, testFn, teardownFn) {
56*c8dee2aaSAndroid Build Coastguard Worker    try {
57*c8dee2aaSAndroid Build Coastguard Worker        let ctx = {};
58*c8dee2aaSAndroid Build Coastguard Worker        // warmup 3 times (arbitrary choice)
59*c8dee2aaSAndroid Build Coastguard Worker        setupFn(ctx);
60*c8dee2aaSAndroid Build Coastguard Worker        await testFn(ctx);
61*c8dee2aaSAndroid Build Coastguard Worker        await testFn(ctx);
62*c8dee2aaSAndroid Build Coastguard Worker        await testFn(ctx);
63*c8dee2aaSAndroid Build Coastguard Worker        teardownFn(ctx);
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker        ctx = {};
66*c8dee2aaSAndroid Build Coastguard Worker        setupFn(ctx);
67*c8dee2aaSAndroid Build Coastguard Worker        let start = Date.now();
68*c8dee2aaSAndroid Build Coastguard Worker        let now = start;
69*c8dee2aaSAndroid Build Coastguard Worker        times = 0;
70*c8dee2aaSAndroid Build Coastguard Worker        // See how many times we can do it in 100ms (arbitrary choice)
71*c8dee2aaSAndroid Build Coastguard Worker        while (now - start < 100) {
72*c8dee2aaSAndroid Build Coastguard Worker            await testFn(ctx);
73*c8dee2aaSAndroid Build Coastguard Worker            now = Date.now();
74*c8dee2aaSAndroid Build Coastguard Worker            times++;
75*c8dee2aaSAndroid Build Coastguard Worker        }
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker        teardownFn(ctx);
78*c8dee2aaSAndroid Build Coastguard Worker
79*c8dee2aaSAndroid Build Coastguard Worker        // Try to make it go for 2 seconds (arbitrarily chosen)
80*c8dee2aaSAndroid Build Coastguard Worker        // Since the pre-try took 100ms, multiply by 20 to get
81*c8dee2aaSAndroid Build Coastguard Worker        // approximate tries in 2s (unless now - start >> 100 ms)
82*c8dee2aaSAndroid Build Coastguard Worker        let goalTimes = times * 20;
83*c8dee2aaSAndroid Build Coastguard Worker        ctx = {};
84*c8dee2aaSAndroid Build Coastguard Worker        setupFn(ctx);
85*c8dee2aaSAndroid Build Coastguard Worker        times = 0;
86*c8dee2aaSAndroid Build Coastguard Worker        start = Date.now();
87*c8dee2aaSAndroid Build Coastguard Worker        while (times < goalTimes) {
88*c8dee2aaSAndroid Build Coastguard Worker            await testFn(ctx);
89*c8dee2aaSAndroid Build Coastguard Worker            times++;
90*c8dee2aaSAndroid Build Coastguard Worker        }
91*c8dee2aaSAndroid Build Coastguard Worker        const end = Date.now();
92*c8dee2aaSAndroid Build Coastguard Worker        teardownFn(ctx);
93*c8dee2aaSAndroid Build Coastguard Worker
94*c8dee2aaSAndroid Build Coastguard Worker        const us = (end - start) * 1000 / times;
95*c8dee2aaSAndroid Build Coastguard Worker        console.log(benchName, `${us} microseconds`)
96*c8dee2aaSAndroid Build Coastguard Worker        return _report(us, benchName);
97*c8dee2aaSAndroid Build Coastguard Worker    } catch(e) {
98*c8dee2aaSAndroid Build Coastguard Worker        console.error('caught error', e);
99*c8dee2aaSAndroid Build Coastguard Worker        return Promise.reject(e);
100*c8dee2aaSAndroid Build Coastguard Worker    }
101*c8dee2aaSAndroid Build Coastguard Worker}
102*c8dee2aaSAndroid Build Coastguard Worker
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Workerfunction _report(microseconds, benchName) {
105*c8dee2aaSAndroid Build Coastguard Worker    return fetch(REPORT_URL, {
106*c8dee2aaSAndroid Build Coastguard Worker        method: 'POST',
107*c8dee2aaSAndroid Build Coastguard Worker        mode: 'no-cors',
108*c8dee2aaSAndroid Build Coastguard Worker        headers: {
109*c8dee2aaSAndroid Build Coastguard Worker            'Content-Type': 'application/json',
110*c8dee2aaSAndroid Build Coastguard Worker        },
111*c8dee2aaSAndroid Build Coastguard Worker        body: JSON.stringify({
112*c8dee2aaSAndroid Build Coastguard Worker            'bench_name': benchName,
113*c8dee2aaSAndroid Build Coastguard Worker            'time_us': microseconds,
114*c8dee2aaSAndroid Build Coastguard Worker        })
115*c8dee2aaSAndroid Build Coastguard Worker    }).then(() => console.log(`Successfully reported ${benchName} to perf aggregator`));
116*c8dee2aaSAndroid Build Coastguard Worker}
117*c8dee2aaSAndroid Build Coastguard Worker
118*c8dee2aaSAndroid Build Coastguard Workerfunction reportError(done) {
119*c8dee2aaSAndroid Build Coastguard Worker    return (e) => {
120*c8dee2aaSAndroid Build Coastguard Worker        console.log("Error with fetching. Likely could not connect to aggegator server", e.message);
121*c8dee2aaSAndroid Build Coastguard Worker        if (fail_on_no_perf) {
122*c8dee2aaSAndroid Build Coastguard Worker            expect(e).toBeUndefined();
123*c8dee2aaSAndroid Build Coastguard Worker        }
124*c8dee2aaSAndroid Build Coastguard Worker        done();
125*c8dee2aaSAndroid Build Coastguard Worker    };
126*c8dee2aaSAndroid Build Coastguard Worker}
127