50 lines
1.1 KiB
TypeScript
50 lines
1.1 KiB
TypeScript
import { Profiler } from "knub/dist/Profiler";
|
|
import { performance } from "perf_hooks";
|
|
import { SECONDS, noop } from "../utils";
|
|
|
|
let _profilingEnabled = false;
|
|
|
|
export const profilingEnabled = () => {
|
|
return _profilingEnabled;
|
|
};
|
|
|
|
export const enableProfiling = () => {
|
|
_profilingEnabled = true;
|
|
};
|
|
|
|
export const disableProfiling = () => {
|
|
_profilingEnabled = false;
|
|
};
|
|
|
|
export const startProfiling = (profiler: Profiler, key: string) => {
|
|
if (!profilingEnabled()) {
|
|
return noop;
|
|
}
|
|
|
|
const startTime = performance.now();
|
|
return () => {
|
|
profiler.addDataPoint(key, performance.now() - startTime);
|
|
};
|
|
};
|
|
|
|
export const calculateBlocking = (coarseness = 10) => {
|
|
if (!profilingEnabled()) {
|
|
return () => 0;
|
|
}
|
|
|
|
let last = performance.now();
|
|
let result = 0;
|
|
const interval = setInterval(() => {
|
|
const now = performance.now();
|
|
const blockedTime = Math.max(0, now - last - coarseness);
|
|
result += blockedTime;
|
|
last = now;
|
|
}, coarseness);
|
|
|
|
setTimeout(() => clearInterval(interval), 10 * SECONDS);
|
|
|
|
return () => {
|
|
clearInterval(interval);
|
|
return result;
|
|
};
|
|
};
|