1const REPORT_URL = 'http://localhost:8081/report_perf_data' 2// Set this to enforce that the perf server must be up. 3// Typically used for debugging. 4const fail_on_no_perf = false; 5 6function benchmarkAndReport(benchName, setupFn, testFn, teardownFn) { 7 try { 8 let ctx = {}; 9 // warmup 3 times (arbitrary choice) 10 setupFn(ctx); 11 testFn(ctx); 12 testFn(ctx); 13 testFn(ctx); 14 teardownFn(ctx); 15 16 ctx = {}; 17 setupFn(ctx); 18 let start = Date.now(); 19 let now = start; 20 times = 0; 21 // See how many times we can do it in 100ms (arbitrary choice) 22 while (now - start < 100) { 23 testFn(ctx); 24 now = Date.now(); 25 times++; 26 } 27 28 teardownFn(ctx); 29 30 // Try to make it go for 2 seconds (arbitrarily chosen) 31 // Since the pre-try took 100ms, multiply by 20 to get 32 // approximate tries in 2s (unless now - start >> 100 ms) 33 let goalTimes = times * 20; 34 ctx = {}; 35 setupFn(ctx); 36 times = 0; 37 start = Date.now(); 38 while (times < goalTimes) { 39 testFn(ctx); 40 times++; 41 } 42 const end = Date.now(); 43 teardownFn(ctx); 44 45 const us = (end - start) * 1000 / times; 46 console.log(benchName, `${us} microseconds`) 47 return _report(us, benchName); 48 } catch(e) { 49 console.error('caught error', e); 50 return Promise.reject(e); 51 } 52} 53 54 55function _report(microseconds, benchName) { 56 return fetch(REPORT_URL, { 57 method: 'POST', 58 mode: 'no-cors', 59 headers: { 60 'Content-Type': 'application/json', 61 }, 62 body: JSON.stringify({ 63 'bench_name': benchName, 64 'time_us': microseconds, 65 }) 66 }).then(() => console.log(`Successfully reported ${benchName} to perf aggregator`)); 67} 68 69function reportError(done) { 70 return (e) => { 71 console.log("Error with fetching. Likely could not connect to aggegator server", e.message); 72 if (fail_on_no_perf) { 73 expect(e).toBeUndefined(); 74 } 75 done(); 76 }; 77}