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