98 lines
2.1 KiB
TypeScript
98 lines
2.1 KiB
TypeScript
import { SUPPORTED_SERVICES_TYPE } from "./baseTypes";
|
|
import { InternalDBs, insertProfilerResultByVault } from "./localdb";
|
|
import { unixTimeToStr } from "./misc";
|
|
|
|
interface BreakPoint {
|
|
label: string;
|
|
fakeTimeMilli: number; // it's NOT a unix timestamp
|
|
indent: number;
|
|
}
|
|
|
|
export class Profiler {
|
|
startTime: number;
|
|
breakPoints: BreakPoint[];
|
|
indent: number;
|
|
constructor(label?: string) {
|
|
this.breakPoints = [];
|
|
this.indent = 0;
|
|
this.startTime = 0;
|
|
|
|
if (label !== undefined) {
|
|
this.startTime = Date.now();
|
|
this.breakPoints.push({
|
|
label: label,
|
|
fakeTimeMilli: performance.now(),
|
|
indent: this.indent,
|
|
});
|
|
}
|
|
}
|
|
|
|
insert(label: string) {
|
|
if (this.breakPoints.length === 0) {
|
|
this.startTime = Date.now();
|
|
}
|
|
this.breakPoints.push({
|
|
label: label,
|
|
fakeTimeMilli: performance.now(),
|
|
indent: this.indent,
|
|
});
|
|
|
|
return this;
|
|
}
|
|
|
|
addIndent() {
|
|
this.indent += 2;
|
|
}
|
|
removeIndent() {
|
|
this.indent -= 2;
|
|
if (this.indent < 0) {
|
|
this.indent = 0;
|
|
}
|
|
}
|
|
|
|
clear() {
|
|
this.breakPoints = [];
|
|
this.indent = 0;
|
|
this.startTime = 0;
|
|
return this;
|
|
}
|
|
|
|
toString() {
|
|
if (this.breakPoints.length === 0) {
|
|
return "nothing in profiler";
|
|
}
|
|
|
|
let res = `[startTime]: ${unixTimeToStr(this.startTime)}`;
|
|
for (let i = 0; i < this.breakPoints.length; ++i) {
|
|
if (i === 0) {
|
|
res += `\n[${this.breakPoints[i]["label"]}]: start`;
|
|
} else {
|
|
const label = this.breakPoints[i]["label"];
|
|
const indent = this.breakPoints[i]["indent"];
|
|
const millsec =
|
|
Math.round(
|
|
(this.breakPoints[i]["fakeTimeMilli"] -
|
|
this.breakPoints[i - 1]["fakeTimeMilli"]) *
|
|
10
|
|
) / 10.0;
|
|
res += `\n${" ".repeat(indent)}[${label}]: ${millsec}ms`;
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
async save(
|
|
db: InternalDBs,
|
|
vaultRandomID: string,
|
|
remoteType: SUPPORTED_SERVICES_TYPE
|
|
) {
|
|
await insertProfilerResultByVault(
|
|
db,
|
|
this.toString(),
|
|
vaultRandomID,
|
|
remoteType
|
|
);
|
|
}
|
|
}
|