Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
// place files you want to import through the `$lib` alias in this folder. | |
interface BandwidthCallback { | |
( | |
elapsedMs: number, | |
loadedBytes: number, | |
totalBytes: number, | |
bytesPerSecond: number, | |
done: boolean | |
): void; | |
} | |
export async function bandwidthTest( | |
onProgress: BandwidthCallback, | |
onLatency: (latency: number) => void | |
) { | |
performance.setResourceTimingBufferSize(100); | |
performance.clearResourceTimings(); | |
// start timer | |
const startTime = performance.now(); | |
// const url = 'https://cdn-test-cloudfront.hf.co/140gb.safetensors'; | |
const url = 'https://cdn-test-cloudfront.hf.co/15mb.json'; | |
const response = await fetch(url); | |
if (!response.ok) { | |
throw new Error(`Network response was not ok: ${response.status}`); | |
} | |
// setTimeout(() => { | |
// const entries = performance.getEntriesByType('resource'); | |
// const resourceEntry = entries.find((e) => e.name === url); | |
// if (!resourceEntry) { | |
// return | |
// } | |
// console.log(resourceEntry); | |
// const { requestStart, responseStart } = resourceEntry; | |
// const latency = responseStart - requestStart; | |
// onLatency(latency); | |
// }, 2000); | |
const latency = performance.now() - startTime; | |
onLatency(latency); | |
const contentLengthHeader = response.headers.get('Content-Length'); | |
const totalBytes = contentLengthHeader ? parseInt(contentLengthHeader, 10) : 0; | |
const reader = response.body.getReader(); | |
let loadedBytes = 0; | |
let lastTimestamp = performance.now(); | |
let lastLoaded = 0; | |
const REPORT_INTERVAL_MS = 500; | |
onProgress(latency, loadedBytes, totalBytes, 0, false); | |
let bytesPerSecond= 0; | |
while (true) { | |
const { done, value } = await reader.read(); | |
if (done) { | |
// stream is finished | |
const elapsedMs = performance.now() - startTime; | |
onProgress(elapsedMs, loadedBytes, totalBytes, bytesPerSecond, true); | |
break; | |
} | |
// `value` is a Uint8Array for this chunk | |
loadedBytes += value.byteLength; | |
// Current time | |
const now = performance.now(); | |
const deltaMs = now - lastTimestamp; | |
if (deltaMs >= REPORT_INTERVAL_MS) { | |
// compute bytes downloaded since last report | |
const deltaBytes = loadedBytes - lastLoaded; | |
// convert ms to seconds | |
const deltaSeconds = deltaMs / 1000; | |
bytesPerSecond = deltaBytes / deltaSeconds; | |
// Invoke callback | |
const elapsedMs = performance.now() - startTime; | |
onProgress(elapsedMs, loadedBytes, totalBytes, bytesPerSecond, false); | |
// Reset our “last” markers | |
lastLoaded = loadedBytes; | |
lastTimestamp = now; | |
} | |
} | |
} | |
export async function counter(callback: BandwidthCallback) { | |
// start timer | |
const startTime = performance.now(); | |
let counter = 0; | |
// set a random value between 50 and 150 | |
const interval = setInterval(() => { | |
counter = Math.floor(Math.random() * 100) + 50; | |
// Calculate elapsed time in milliseconds | |
const elapsedMs = performance.now() - startTime; | |
callback(elapsedMs, 100, 100, counter, false); | |
}, 1000); | |
// Stop the counter after 3600 seconds | |
setTimeout(() => { | |
clearInterval(interval); | |
const elapsedMs = performance.now() - startTime; | |
callback(elapsedMs, 100, 100, counter, true); | |
}, 3600 * 1000); | |
} | |