diff --git a/packages/web/src/components/ComparisonView.tsx b/packages/web/src/components/ComparisonView.tsx index 0d80f1f..2dfa813 100644 --- a/packages/web/src/components/ComparisonView.tsx +++ b/packages/web/src/components/ComparisonView.tsx @@ -200,7 +200,7 @@ const ComparisonView: Component = props => { - {Math.abs(row.change).toFixed(1)}% + {Math.abs(row.change).toFixed(2)}% } diff --git a/src/components/ComparisonView.tsx b/src/components/ComparisonView.tsx deleted file mode 100644 index b98ffa9..0000000 --- a/src/components/ComparisonView.tsx +++ /dev/null @@ -1,246 +0,0 @@ -import { Component, For, createSignal, createMemo, Show } from 'solid-js'; -import { ComparisonEntry } from '../utils/types'; -import { - formatBytes, - formatNumber, - formatTime, - formatPercent, - calculateChange, -} from '../utils/formatters'; -import { ArrowRight, ArrowDown, ArrowUp, X } from 'lucide-solid'; - -interface ComparisonViewProps { - entries: ComparisonEntry[]; - onSelect: (entry: ComparisonEntry) => void; - onDelete: (id: number) => void; -} - -const ComparisonView: Component = props => { - const [leftEntry, setLeftEntry] = createSignal(null); - const [rightEntry, setRightEntry] = createSignal(null); - - const comparison = createMemo(() => { - const left = leftEntry(); - const right = rightEntry(); - if (!left || !right) return null; - - const fields = [ - ['cpuTime', 'CPU Time', 'time'], - ['envs.number', 'Env Count', 'number'], - ['envs.bytes', 'Env Memory', 'bytes'], - ['list.elements', 'List Elements', 'number'], - ['list.concats', 'List Concat', 'number'], - ['values.number', 'Value Count', 'number'], - ['symbols.number', 'Symbol Count', 'number'], - ['sets.number', 'Set Count', 'number'], - ['sets.elements', 'Attributes', 'number'], - ['nrExprs', 'Expressions', 'number'], - ['nrThunks', 'Thunks', 'number'], - ['nrAvoided', 'Thunks Avoided', 'number'], - ['nrLookups', 'Lookups', 'number'], - ['nrFunctionCalls', 'Function Calls', 'number'], - ['nrPrimOpCalls', 'PrimOp Calls', 'number'], - ].map(([key, label, format]) => ({ - key, - label, - format: format as 'number' | 'bytes' | 'time' | 'percent', - })); - - return fields.map(field => { - const getValue = ( - data: ComparisonEntry['data'], - raw: Record, - ): { value: number; present: boolean } => { - const keys = field.key.split('.'); - let value: unknown = data; - for (const k of keys) value = value && (value as Record)?.[k]; - - let present = typeof value === 'number'; - if (!present) { - present = - keys.reduce((obj: unknown, k: string) => { - if (obj && typeof obj === 'object' && k in (obj as Record)) { - const nested = (obj as Record)[k]; - return typeof nested === 'object' && nested !== null ? nested : true; - } - return undefined; - }, raw as unknown) !== undefined; - } - - return { value: typeof value === 'number' ? value : 0, present }; - }; - - const leftVal = getValue(left.data, left.raw); - const rightVal = getValue(right.data, right.raw); - const change = calculateChange(rightVal.value, leftVal.value); - const isMissing = !leftVal.present || !rightVal.present; - - return { - ...field, - leftValue: leftVal.value, - rightValue: rightVal.value, - change: change.percent, - isReduction: change.isReduction, - isDifferent: leftVal.value !== rightVal.value, - isMissing, - }; - }); - }); - - const selectLeft = (e: Event) => { - const id = parseInt((e.target as HTMLSelectElement).value); - const entry = props.entries.find(en => en.id === id); - setLeftEntry(entry || null); - }; - - const selectRight = (e: Event) => { - const id = parseInt((e.target as HTMLSelectElement).value); - const entry = props.entries.find(en => en.id === id); - setRightEntry(entry || null); - }; - - return ( -
-
-
- - -
-
- -
-
- - -
-
- - 0}> -
-

Saved Snapshots

- - {entry => ( -
- {entry.name} - -
- )} -
-
-
- - Select two snapshots to compare metrics
} - > -
-
-
Metric
-
{leftEntry()?.name}
-
{rightEntry()?.name}
-
Change
-
- - {row => ( -
-
- {row.label} -
-
- - N/A - -
-
- - N/A - -
-
- —}> - - - - - - - - {Math.abs(row.change).toFixed(2)}% - - - } - > - - N/A - - -
-
- )} -
-
- -
- r.isReduction)}> -
- {' '} - {comparison()?.filter(r => r.isReduction && r.isDifferent).length} improved -
-
- !r.isReduction && r.isDifferent)}> -
- {' '} - {comparison()?.filter(r => !r.isReduction && r.isDifferent).length} regressed -
-
-
- - - ); -}; - -export default ComparisonView;