feat: add simple performance tracker
All checks were successful
Deploy to GitHub Pages / build_site (push) Successful in 2m23s
All checks were successful
Deploy to GitHub Pages / build_site (push) Successful in 2m23s
This commit is contained in:
17
app/src/lib/performance/PerformanceViewer.svelte
Normal file
17
app/src/lib/performance/PerformanceViewer.svelte
Normal file
@@ -0,0 +1,17 @@
|
||||
<script lang="ts">
|
||||
import type { PerformanceStore } from ".";
|
||||
|
||||
export let store: PerformanceStore;
|
||||
|
||||
function getPerformanceData() {
|
||||
return Object.entries($store.total).sort((a, b) => b[1] - a[1]);
|
||||
}
|
||||
</script>
|
||||
|
||||
{#if $store.runs.length !== 0}
|
||||
{#each getPerformanceData() as [key, value]}
|
||||
<p>{key}: {Math.floor(value * 100) / 100}ms</p>
|
||||
{/each}
|
||||
{:else}
|
||||
<p>No runs available</p>
|
||||
{/if}
|
||||
62
app/src/lib/performance/index.ts
Normal file
62
app/src/lib/performance/index.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
import { readable, type Readable } from "svelte/store";
|
||||
|
||||
type PerformanceData = {
|
||||
total: Record<string, number>;
|
||||
runs: Record<string, number[]>[];
|
||||
}
|
||||
export interface PerformanceStore extends Readable<PerformanceData> {
|
||||
startRun(): void;
|
||||
stopRun(): void;
|
||||
addPoint(name: string, value?: number): void;
|
||||
}
|
||||
|
||||
export function createPerformanceStore(): PerformanceStore {
|
||||
|
||||
let data: PerformanceData = { total: {}, runs: [] };
|
||||
|
||||
let currentRun: Record<string, number[]> | undefined;
|
||||
|
||||
let set: (v: PerformanceData) => void;
|
||||
|
||||
const { subscribe } = readable<PerformanceData>({ total: {}, runs: [] }, (_set) => {
|
||||
set = _set;
|
||||
});
|
||||
|
||||
function startRun() {
|
||||
currentRun = {};
|
||||
}
|
||||
|
||||
function stopRun() {
|
||||
if (currentRun) {
|
||||
// Calculate total
|
||||
Object.keys(currentRun).forEach((name) => {
|
||||
if (!currentRun?.[name]?.length) return;
|
||||
let runTotal = currentRun[name].reduce((a, b) => a + b, 0) / currentRun[name].length;
|
||||
if (!data.total[name]) {
|
||||
data.total[name] = runTotal;
|
||||
} else {
|
||||
data.total[name] = (data.total[name] + runTotal) / 2;
|
||||
}
|
||||
});
|
||||
|
||||
data.runs.push(currentRun);
|
||||
currentRun = undefined;
|
||||
set(data);
|
||||
}
|
||||
}
|
||||
|
||||
function addPoint(name: string, value: number) {
|
||||
if (!currentRun) return;
|
||||
currentRun[name] = currentRun[name] || [];
|
||||
currentRun[name].push(value);
|
||||
}
|
||||
|
||||
return {
|
||||
subscribe,
|
||||
startRun,
|
||||
stopRun,
|
||||
addPoint,
|
||||
}
|
||||
}
|
||||
|
||||
export { default as PerformanceViewer } from "./PerformanceViewer.svelte";
|
||||
Reference in New Issue
Block a user