1+ #! /bin/bash
2+ # Exit on error
3+ set -Eeuxo pipefail
4+
5+ # Load common variables
6+ source " $1 /variations/common.sh"
7+
8+ # Update command strings to use registry configuration
9+ update_commands_for_registry () {
10+ BENCH_COMMAND_NPM=" npm install --registry=$BENCH_REGISTRY_URL --no-audit --no-fund --silent >> $BENCH_OUTPUT_FOLDER /npm-output-\$ {HYPERFINE_ITERATION}.log 2>&1"
11+ BENCH_COMMAND_YARN=" corepack yarn@1 install --registry $BENCH_REGISTRY_URL --silent > $BENCH_OUTPUT_FOLDER /yarn-output-\$ {HYPERFINE_ITERATION}.log 2>&1"
12+ BENCH_COMMAND_BERRY=" echo \" $BENCH_COMMAND_BERRY_PRE \" > .yarnrc.yml; echo \" npmRegistryServer: $BENCH_REGISTRY_URL \" >> .yarnrc.yml; corepack yarn@latest install > $BENCH_OUTPUT_FOLDER /berry-output-\$ {HYPERFINE_ITERATION}.log 2>&1"
13+ BENCH_COMMAND_PNPM=" corepack pnpm@latest install --registry=$BENCH_REGISTRY_URL --silent > $BENCH_OUTPUT_FOLDER /pnpm-output-\$ {HYPERFINE_ITERATION}.log 2>&1"
14+ BENCH_COMMAND_VLT=" vlt install --registry=$BENCH_REGISTRY_URL --view=silent > $BENCH_OUTPUT_FOLDER /vlt-output-\$ {HYPERFINE_ITERATION}.log 2>&1"
15+ # Bun and Deno don't support custom registries in the same way
16+ BENCH_COMMAND_BUN=" "
17+ BENCH_COMMAND_DENO=" "
18+ BENCH_INCLUDE_BUN=" "
19+ BENCH_INCLUDE_DENO=" "
20+ }
21+
22+ # Pre-warm registry function
23+ warm_registry () {
24+ local registry_type=$1
25+
26+ echo " Pre-warming $registry_type registry..."
27+
28+ # Save current directory
29+ local current_dir=$( pwd)
30+
31+ # Use npm to install packages and warm the cache
32+ npm install --registry=" $BENCH_REGISTRY_URL " --silent > " $BENCH_OUTPUT_FOLDER /warm-$registry_type .log" 2>&1 || true
33+
34+ # Clean up after warming
35+ bash " $BENCH_SCRIPTS /clean-helpers.sh" clean_node_modules clean_lockfiles
36+
37+ cd " $current_dir "
38+ }
39+
40+ # Function to run benchmarks for a specific registry
41+ run_registry_benchmark () {
42+ local registry_type=$1
43+
44+ # Stop any existing registries
45+ bash " $BENCH_SCRIPTS /registry-helpers.sh" stop_all
46+
47+ # Clean the registry cache first
48+ bash " $BENCH_SCRIPTS /registry-helpers.sh" clean " $registry_type "
49+
50+ # Start the registry
51+ BENCH_REGISTRY_URL=$( bash " $BENCH_SCRIPTS /registry-helpers.sh" start " $registry_type " " $BENCH_OUTPUT_FOLDER " )
52+ export BENCH_REGISTRY_URL
53+
54+ echo " Registry started at: $BENCH_REGISTRY_URL "
55+
56+ # Update commands with registry URL
57+ update_commands_for_registry
58+
59+ # Pre-warm the registry
60+ warm_registry " $registry_type "
61+
62+ # Run the benchmark suite
63+ echo " Running benchmarks with $registry_type registry (pre-warmed)..."
64+ hyperfine --ignore-failure \
65+ --time-unit=millisecond \
66+ --export-json=" $BENCH_OUTPUT_FOLDER /benchmarks-$registry_type .json" \
67+ --warmup=" $BENCH_WARMUP " \
68+ --runs=" $BENCH_RUNS " \
69+ --prepare=" sleep 1; bash $BENCH_SCRIPTS /clean-helpers.sh clean_all" \
70+ --conclude=" sleep 1; bash $BENCH_SCRIPTS /package-count.sh $BENCH_OUTPUT_FOLDER ; bash $BENCH_SCRIPTS /clean-helpers.sh clean_all" \
71+ --cleanup=" bash $BENCH_SCRIPTS /clean-helpers.sh clean_all" \
72+ ${BENCH_INCLUDE_NPM: +--command-name=" npm-$registry_type " " $BENCH_COMMAND_NPM " } \
73+ ${BENCH_INCLUDE_YARN: +--command-name=" yarn-$registry_type " " $BENCH_COMMAND_YARN " } \
74+ ${BENCH_INCLUDE_BERRY: +--command-name=" berry-$registry_type " " $BENCH_COMMAND_BERRY " } \
75+ ${BENCH_INCLUDE_PNPM: +--command-name=" pnpm-$registry_type " " $BENCH_COMMAND_PNPM " } \
76+ ${BENCH_INCLUDE_VLT: +--command-name=" vlt-$registry_type " " $BENCH_COMMAND_VLT " }
77+
78+ # Stop the registry
79+ bash " $BENCH_SCRIPTS /registry-helpers.sh" stop " $registry_type "
80+ }
81+
82+ # Run benchmarks for both registries
83+ run_registry_benchmark " vsr"
84+ run_registry_benchmark " verdaccio"
85+
86+ # Merge results
87+ echo " Merging benchmark results..."
88+ jq -s ' .[0] * {results: (.[0].results + .[1].results)}' \
89+ " $BENCH_OUTPUT_FOLDER /benchmarks-vsr.json" \
90+ " $BENCH_OUTPUT_FOLDER /benchmarks-verdaccio.json" \
91+ > " $BENCH_OUTPUT_FOLDER /benchmarks.json"
92+
93+ collect_package_count
0 commit comments