Skip to content

Commit 1973f78

Browse files
committed
feat: add ranking emojis
1 parent ec2e4a2 commit 1973f78

File tree

2 files changed

+101
-12
lines changed

2 files changed

+101
-12
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Benchmark comparing JavaScript bundlers and build tools ([Rspack](https://github
2121
- Minification is enabled in production for all tools.
2222
- Source map is enabled in development and disabled in production for all tools.
2323

24-
## Bench cases
24+
## Results
2525

2626
> Data from GitHub Actions: https://github.com/rspack-contrib/build-tools-performance/actions/runs/16198040814 (2025-07-10)
2727

benchmark.mjs

Lines changed: 100 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -543,10 +543,54 @@ async function getFileSizes(targetDir) {
543543
};
544544
}
545545

546-
// average results
546+
// Add ranking emojis to performance metrics (smaller values are better)
547+
function addRankingEmojis(toolNames, results, metricKey) {
548+
const values = toolNames.map((name) => ({
549+
name,
550+
value: parseFloat(results[name][metricKey].replace('ms', '')),
551+
originalValue: results[name][metricKey],
552+
}));
553+
554+
// Sort by value (smaller is better)
555+
values.sort((a, b) => a.value - b.value);
556+
557+
const emojis = ['🥇', '🥈', '🥉'];
558+
const rankedValues = {};
559+
560+
values.forEach((item, rank) => {
561+
const emoji = rank < 3 ? emojis[rank] : '';
562+
rankedValues[item.name] = item.originalValue + emoji;
563+
});
564+
565+
return rankedValues;
566+
}
567+
568+
// Add ranking emojis to bundle size metrics (smaller values are better)
569+
function addSizeRankingEmojis(toolNames, results, metricKey) {
570+
const values = toolNames.map((name) => ({
571+
name,
572+
value: parseFloat(results[name][metricKey].replace('kB', '')),
573+
originalValue: results[name][metricKey],
574+
}));
575+
576+
// Sort by value (smaller is better)
577+
values.sort((a, b) => a.value - b.value);
578+
579+
const emojis = ['🥇', '🥈', '🥉'];
580+
const rankedValues = {};
581+
582+
values.forEach((item, rank) => {
583+
const emoji = rank < 3 ? emojis[rank] : '';
584+
rankedValues[item.name] = item.originalValue + emoji;
585+
});
586+
587+
return rankedValues;
588+
}
589+
590+
// Calculate average results
547591
const averageResults = {};
548592

549-
// drop the warmup results
593+
// Drop the warmup results
550594
perfResults = perfResults.slice(warmupTimes);
551595

552596
for (const result of perfResults) {
@@ -576,33 +620,78 @@ logger.success('Benchmark finished!\n');
576620

577621
let markdownLogs = '';
578622

623+
// Use actual tool names from buildTools (with version numbers)
624+
const actualToolNames = buildTools.map(({ name }) => name);
625+
579626
markdownLogs += '#### Build performance\n\n';
580627

581628
if (runDev) {
629+
// Add ranking emojis for each metric
630+
const devColdStartRanked = addRankingEmojis(
631+
actualToolNames,
632+
averageResults,
633+
'devColdStart',
634+
);
635+
const rootHmrRanked = addRankingEmojis(
636+
actualToolNames,
637+
averageResults,
638+
'rootHmr',
639+
);
640+
const leafHmrRanked = addRankingEmojis(
641+
actualToolNames,
642+
averageResults,
643+
'leafHmr',
644+
);
645+
const prodBuildRanked = addRankingEmojis(
646+
actualToolNames,
647+
averageResults,
648+
'prodBuild',
649+
);
650+
582651
markdownLogs += markdownTable([
583652
['Name', 'Dev cold start', 'Root HMR', 'Leaf HMR', 'Prod build'],
584-
...buildTools.map(({ name }) => [
653+
...actualToolNames.map((name) => [
585654
name,
586-
`${averageResults[name].devColdStart} (${averageResults[name].serverStart} + ${averageResults[name].onLoad})`,
587-
averageResults[name].rootHmr,
588-
averageResults[name].leafHmr,
589-
averageResults[name].prodBuild,
655+
`${devColdStartRanked[name]} (${averageResults[name].serverStart.replace('ms', '')} + ${averageResults[name].onLoad.replace('ms', '')})`,
656+
rootHmrRanked[name],
657+
leafHmrRanked[name],
658+
prodBuildRanked[name],
590659
]),
591660
]);
592661
} else {
662+
// Add ranking emojis for prod build only
663+
const prodBuildRanked = addRankingEmojis(
664+
actualToolNames,
665+
averageResults,
666+
'prodBuild',
667+
);
668+
593669
markdownLogs += markdownTable([
594670
['Name', 'Prod build'],
595-
...buildTools.map(({ name }) => [name, averageResults[name].prodBuild]),
671+
...actualToolNames.map((name) => [name, prodBuildRanked[name]]),
596672
]);
597673
}
598674

599675
markdownLogs += '\n\n#### Bundle sizes\n\n';
676+
677+
// Add ranking emojis for bundle sizes
678+
const totalSizeRanked = addSizeRankingEmojis(
679+
actualToolNames,
680+
sizeResults,
681+
'totalSize',
682+
);
683+
const totalGzipSizeRanked = addSizeRankingEmojis(
684+
actualToolNames,
685+
sizeResults,
686+
'totalGzipSize',
687+
);
688+
600689
markdownLogs += markdownTable([
601690
['Name', 'Total size', 'Gzipped size'],
602-
...buildTools.map(({ name }) => [
691+
...actualToolNames.map((name) => [
603692
name,
604-
sizeResults[name].totalSize,
605-
sizeResults[name].totalGzipSize,
693+
totalSizeRanked[name],
694+
totalGzipSizeRanked[name],
606695
]),
607696
]);
608697

0 commit comments

Comments
 (0)