diff --git a/src/sandbox/generate-svg.ts b/src/sandbox/generate-svg.ts
index 9740b3d..faf883b 100644
--- a/src/sandbox/generate-svg.ts
+++ b/src/sandbox/generate-svg.ts
@@ -266,12 +266,13 @@ ${sponsorImages.length > 0 ? (() => {
const total = r.iterations.length;
const rank = i + 1;
const medianMs = r.summary.ttiMs.median;
+ const allFailed = ok === 0;
const score = r.compositeScore !== undefined ? r.compositeScore.toFixed(1) : '--';
// Color code based on speed
- let speedClass = 'fast';
- if (medianMs > 2000) speedClass = 'slow';
- else if (medianMs > 1000) speedClass = 'medium';
+ let speedClass = allFailed ? 'slow' : 'fast';
+ if (!allFailed && medianMs > 2000) speedClass = 'slow';
+ else if (!allFailed && medianMs > 1000) speedClass = 'medium';
// Rank styling
let rankClass = 'rank';
@@ -279,14 +280,18 @@ ${sponsorImages.length > 0 ? (() => {
else if (rank === 2) rankClass = 'rank rank-2';
else if (rank === 3) rankClass = 'rank rank-3';
+ const medianDisplay = allFailed ? '--' : formatSeconds(medianMs);
+ const p95Display = allFailed ? '--' : formatSeconds(r.summary.ttiMs.p95);
+ const p99Display = allFailed ? '--' : formatSeconds(r.summary.ttiMs.p99);
+
svg += `
${rank}
${formatProviderName(r.provider)}
${score}
- ${formatSeconds(medianMs)}
- ${formatSeconds(r.summary.ttiMs.p95)}
- ${formatSeconds(r.summary.ttiMs.p99)}
+ ${medianDisplay}
+ ${p95Display}
+ ${p99Display}
${ok}/${total}
`;
diff --git a/src/sandbox/table.ts b/src/sandbox/table.ts
index ecf72ae..83dab02 100644
--- a/src/sandbox/table.ts
+++ b/src/sandbox/table.ts
@@ -62,12 +62,13 @@ export function printResultsTable(results: BenchmarkResult[]): void {
? result.compositeScore.toFixed(1)
: '--';
+ const allFailed = successful === 0;
console.log([
pad(result.provider, nameWidth),
pad(score, 8),
- pad(formatSeconds(result.summary.ttiMs.median), colWidth),
- pad(formatSeconds(result.summary.ttiMs.p95), colWidth),
- pad(formatSeconds(result.summary.ttiMs.p99), colWidth),
+ pad(allFailed ? '--' : formatSeconds(result.summary.ttiMs.median), colWidth),
+ pad(allFailed ? '--' : formatSeconds(result.summary.ttiMs.p95), colWidth),
+ pad(allFailed ? '--' : formatSeconds(result.summary.ttiMs.p99), colWidth),
pad(`${successful}/${total} OK`, 10),
].join(' | '));
}
diff --git a/src/storage/generate-svg.ts b/src/storage/generate-svg.ts
index 46423b3..e462066 100644
--- a/src/storage/generate-svg.ts
+++ b/src/storage/generate-svg.ts
@@ -184,12 +184,13 @@ ${sponsorImages.length > 0 ? (() => {
const total = r.iterations.length;
const rank = i + 1;
const downloadMs = r.summary.downloadMs.median;
+ const allFailed = ok === 0;
const score = r.compositeScore !== undefined ? r.compositeScore.toFixed(1) : '--';
// Color code based on download speed
- let speedClass = 'fast';
- if (downloadMs > 5000) speedClass = 'slow';
- else if (downloadMs > 2000) speedClass = 'medium';
+ let speedClass = allFailed ? 'slow' : 'fast';
+ if (!allFailed && downloadMs > 5000) speedClass = 'slow';
+ else if (!allFailed && downloadMs > 2000) speedClass = 'medium';
// Rank styling
let rankClass = 'rank';
@@ -197,14 +198,18 @@ ${sponsorImages.length > 0 ? (() => {
else if (rank === 2) rankClass = 'rank rank-2';
else if (rank === 3) rankClass = 'rank rank-3';
+ const downloadDisplay = allFailed ? '--' : formatSeconds(downloadMs);
+ const throughputDisplay = allFailed ? '--' : formatMbps(r.summary.throughputMbps.median);
+ const uploadDisplay = allFailed ? '--' : formatSeconds(r.summary.uploadMs.median);
+
svg += `
${rank}
${formatProviderName(r.provider)}
${score}
- ${formatSeconds(downloadMs)}
- ${formatMbps(r.summary.throughputMbps.median)}
- ${formatSeconds(r.summary.uploadMs.median)}
+ ${downloadDisplay}
+ ${throughputDisplay}
+ ${uploadDisplay}
${ok}/${total}
`;
diff --git a/src/update-readme.ts b/src/update-readme.ts
index 8c904d5..33149a1 100644
--- a/src/update-readme.ts
+++ b/src/update-readme.ts
@@ -69,9 +69,13 @@ function buildTable(results: BenchmarkResult[]): string {
} else {
const ok = r.iterations.filter(i => !i.error).length;
const total = r.iterations.length;
+ const allFailed = ok === 0;
const score = r.compositeScore !== undefined ? r.compositeScore.toFixed(1) : '--';
+ const median = allFailed ? '--' : formatSeconds(r.summary.ttiMs.median);
+ const p95 = allFailed ? '--' : formatSeconds(r.summary.ttiMs.p95);
+ const p99 = allFailed ? '--' : formatSeconds(r.summary.ttiMs.p99);
lines.push(
- `
| ${capitalize(r.provider)} | ${score} | ${formatSeconds(r.summary.ttiMs.median)} | ${formatSeconds(r.summary.ttiMs.p95)} | ${formatSeconds(r.summary.ttiMs.p99)} | ${ok}/${total} |
`
+ `| ${capitalize(r.provider)} | ${score} | ${median} | ${p95} | ${p99} | ${ok}/${total} |
`
);
}
}