// Run in a fresh `bun run browser` page's DevTools console. Uses the actual UI and worker. window.crivoBenchmark = { runs: [], status: 'starting', userAgent: navigator.userAgent, threads: navigator.hardwareConcurrency, crossOriginIsolated: window.crossOriginIsolated } ;(async () => { const report = window.crivoBenchmark const adapter = await navigator.gpu?.requestAdapter() report.gpu = adapter ? { ...Object.fromEntries( ['vendor', 'architecture', 'device', 'description'].map((k) => [k, adapter.info[k]]) ) } : null const NativeWorker = window.Worker let pending let metrics window.Worker = class extends NativeWorker { constructor(...args) { super(...args) this.addEventListener('message', ({ data }) => { if (data.kind === 'metrics') metrics = data.metrics if (data.kind === 'error') pending?.reject(Error(data.message)) if (data.kind === 'result') { if (!data.result.ok) pending?.reject(Error(JSON.stringify(data.result.error))) else pending?.resolve({ ...metrics, totalMs: data.totalMs }) } }) this.addEventListener('error', () => pending?.reject(Error('Worker stopped'))) } postMessage(data, ...args) { report.input = data.input super.postMessage(data, ...args) } } const run = () => new Promise((resolve, reject) => { const timeout = setTimeout(() => reject(Error('Run timed out')), 240000) pending = { resolve: (data) => { clearTimeout(timeout) resolve(data) }, reject: (error) => { clearTimeout(timeout) reject(error) } } document.getElementById('run').click() }) for (const size of ['17m', '32m', '68m', '150m', '400m', '1b']) { for (const [device, dtype] of [ ['cpu', 'q8'], ...(size === '1b' ? [] : [['cpu', 'fp32']]), ['gpu', 'fp32'] ]) { const entry = { size, device, dtype, samples: [] } report.runs.push(entry) report.status = `${size} ${device} ${dtype}` for (const [id, value] of [ ['size', size], ['device', device], ['dtype', dtype] ]) { const select = document.getElementById(id) select.value = value select.dispatchEvent(new Event('change')) } await new Promise((resolve) => setTimeout(resolve, 50)) entry.first = await run() for (let i = 0; i < 23; i++) { await new Promise((resolve) => setTimeout(resolve, 50)) const result = await run() if (result.loadMs !== 0) throw Error('Session was not reused') if (i >= 3) entry.samples.push(result) } } } report.status = 'complete' })().catch((error) => { window.crivoBenchmark.error = String(error) })