Add Perf jobs for PathKit
We have a similar ingestion strategy to Gold.
I tried to use something off the shelf like benchmark.js
but passing the PathKit context into the benchmarks was
non-trivial. Plus, making a basic benchmarking tool
ended up being not too hard.
We should be able to re-use the docker container/aggregator
for CanvasKit too.
Bug: skia:
Change-Id: I613dfc58ea57c31cf71566a8ac55f8df9272ad25
Reviewed-on: https://skia-review.googlesource.com/c/161620
Commit-Queue: Kevin Lubick <kjlubick@google.com>
Reviewed-by: Joe Gregorio <jcgregorio@google.com>
Reviewed-by: Stephan Altmueller <stephana@google.com>
diff --git a/modules/pathkit/perf/perfReporter.js b/modules/pathkit/perf/perfReporter.js
new file mode 100644
index 0000000..d74110c
--- /dev/null
+++ b/modules/pathkit/perf/perfReporter.js
@@ -0,0 +1,72 @@
+const REPORT_URL = 'http://localhost:8081/report_perf_data'
+// Set this to enforce that the perf server must be up.
+// Typically used for debugging.
+const fail_on_no_perf = false;
+
+
+function benchmarkAndReport(benchName, setupFn, testFn, teardownFn) {
+ let ctx = {};
+ // warmup 3 times (arbitrary choice)
+ setupFn(ctx);
+ testFn(ctx);
+ testFn(ctx);
+ testFn(ctx);
+ teardownFn(ctx);
+
+ ctx = {};
+ setupFn(ctx);
+ let start = Date.now();
+ let now = start;
+ times = 0;
+ // See how many times we can do it in 100ms (arbitrary choice)
+ while (now - start < 100) {
+ testFn(ctx);
+ now = Date.now();
+ times++;
+ }
+
+ teardownFn(ctx);
+
+ // Try to make it go for 2 seconds (arbitrarily chosen)
+ // Since the pre-try took 100ms, multiply by 20 to get
+ // approximate tries in 2s
+ let goalTimes = times * 20;
+ setupFn(ctx);
+ start = Date.now();
+ times = 0;
+ while (times < goalTimes) {
+ testFn(ctx);
+ times++;
+ }
+ let end = Date.now();
+ teardownFn(ctx);
+
+ let us = (end - start) * 1000 / times;
+ console.log(benchName, `${us} microseconds`)
+ return _report(us, benchName);
+}
+
+
+function _report(microseconds, benchName) {
+ return fetch(REPORT_URL, {
+ method: 'POST',
+ mode: 'no-cors',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ 'bench_name': benchName,
+ 'time_us': microseconds,
+ })
+ }).then(() => console.log(`Successfully reported ${benchName} to perf aggregator`));
+}
+
+function reportError(done) {
+ return (e) => {
+ console.log("Error with fetching. Likely could not connect to aggegator server", e.message);
+ if (fail_on_no_perf) {
+ expect(e).toBeUndefined();
+ }
+ done();
+ };
+}
\ No newline at end of file