From 7ea20c8d4353b774a51d12884700d63690a095b3 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Fri, 17 Jul 2026 02:21:49 +0000 Subject: [PATCH] feat: add provider benchmark script --- script/provider-benchmark.sh | 139 +++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100755 script/provider-benchmark.sh diff --git a/script/provider-benchmark.sh b/script/provider-benchmark.sh new file mode 100755 index 0000000000..54773c3aff --- /dev/null +++ b/script/provider-benchmark.sh @@ -0,0 +1,139 @@ +#!/usr/bin/env bash + +# Cold OpenCode clone/install/typecheck benchmark for a fresh Ubuntu x86_64 VM. + +set -euo pipefail + +REPO_URL="${BENCH_REPO_URL:-https://github.com/anomalyco/opencode.git}" +COMMIT="${BENCH_COMMIT:-08fb47373509ba64b13441061314eeacf4264f51}" +BUN_VERSION="${BENCH_BUN_VERSION:-1.3.14}" +NODE_VERSION="${BENCH_NODE_VERSION:-24.14.1}" +ROOT="${BENCH_ROOT:-/tmp/opencode-provider-benchmark}" +KEEP_ROOT="${BENCH_KEEP_ROOT:-false}" + +timestamp() { + date +%s%N +} + +phase() { + local name="$1" + shift + local start end + start="$(timestamp)" + "$@" + end="$(timestamp)" + printf 'BENCH_PHASE\t%s\t%s\n' "$name" "$(( (end - start) / 1000000 ))" +} + +if [[ "$(id -u)" -eq 0 ]]; then + SUDO=() +elif command -v sudo >/dev/null; then + SUDO=(sudo) +else + printf 'BENCH_ERROR\tprepare\troot_or_sudo_required\n' >&2 + exit 1 +fi + +prepare() { + command -v apt-get >/dev/null || { + printf 'BENCH_ERROR\tprepare\tapt_get_required\n' >&2 + return 1 + } + "${SUDO[@]}" apt-get update -qq + "${SUDO[@]}" env DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \ + bash build-essential ca-certificates curl git python3 python3-setuptools unzip xz-utils + python3 -c 'import setuptools' + + if [[ "$(node --version 2>/dev/null || true)" != "v${NODE_VERSION}" ]]; then + local archive="node-v${NODE_VERSION}-linux-x64.tar.xz" + local prefix="/opt/node-v${NODE_VERSION}-linux-x64" + curl -fsSL "https://nodejs.org/download/release/v${NODE_VERSION}/${archive}" -o "/tmp/${archive}" + "${SUDO[@]}" rm -rf "$prefix" + "${SUDO[@]}" mkdir -p "$prefix" + "${SUDO[@]}" tar -xJf "/tmp/${archive}" --strip-components=1 -C "$prefix" + for executable in node npm npx corepack; do + "${SUDO[@]}" ln -sfn "$prefix/bin/$executable" "/usr/local/bin/$executable" + done + fi + test "$(node --version)" = "v${NODE_VERSION}" +} + +download_bun() { + curl -fsSL \ + "https://github.com/oven-sh/bun/releases/download/bun-v${BUN_VERSION}/bun-linux-x64-baseline.zip" \ + -o "$ROOT/bun.zip" +} + +unpack_bun() { + unzip -q -j "$ROOT/bun.zip" bun-linux-x64-baseline/bun -d "$BUN_INSTALL/bin" + chmod +x "$BUN_INSTALL/bin/bun" +} + +clone_repo() { + mkdir "$ROOT/repo" + cd "$ROOT/repo" + git init -q + git remote add origin "$REPO_URL" + git fetch -q --depth=1 origin "$COMMIT" + git checkout -q --detach FETCH_HEAD + test "$(git rev-parse HEAD)" = "$COMMIT" +} + +install_dependencies() { + cd "$ROOT/repo" + bun install + git diff --exit-code -- bun.lock package.json +} + +typecheck() { + cd "$ROOT/repo" + bun typecheck +} + +disk() { + du -sx --block-size=1 "$ROOT" | awk '{print $1}' +} + +cleanup() { + local status=$? + if [[ "$KEEP_ROOT" != "true" ]]; then + rm -rf "$ROOT" + fi + exit "$status" +} +trap cleanup EXIT INT TERM + +total_start="$(timestamp)" +phase prepare prepare + +rm -rf "$ROOT" +mkdir -p "$ROOT/bun/bin" "$ROOT/home" "$ROOT/bun-cache" +export HOME="$ROOT/home" +export BUN_INSTALL="$ROOT/bun" +export BUN_INSTALL_CACHE_DIR="$ROOT/bun-cache" +export PATH="$BUN_INSTALL/bin:$PATH" +export CI=true +export OPENCODE_DISABLE_SHARE=true +export TURBO_TELEMETRY_DISABLED=1 + +printf 'BENCH_META\tcommit\t%s\n' "$COMMIT" +printf 'BENCH_META\tarchitecture\t%s\n' "$(uname -m)" +printf 'BENCH_META\tkernel\t%s\n' "$(uname -sr)" +printf 'BENCH_META\tlogical_cpus\t%s\n' "$(getconf _NPROCESSORS_ONLN)" +printf 'BENCH_META\tcpu_model\t%s\n' "$(awk -F: '/model name/{gsub(/^[ \t]+/, "", $2); print $2; exit}' /proc/cpuinfo)" +printf 'BENCH_META\tmemory_kib\t%s\n' "$(awk '/MemTotal/{print $2}' /proc/meminfo)" + +phase bun_download download_bun +phase bun_unpack unpack_bun +printf 'BENCH_META\tbun_version\t%s\n' "$(bun --version)" +printf 'BENCH_META\tnode_version\t%s\n' "$(node --version)" + +phase clone clone_repo +printf 'BENCH_DISK\tafter_clone\t%s\n' "$(disk)" +phase install install_dependencies +printf 'BENCH_DISK\tafter_install\t%s\n' "$(disk)" +phase typecheck typecheck +printf 'BENCH_DISK\tafter_typecheck\t%s\n' "$(disk)" +printf 'BENCH_DONE\t%s\n' "$(git -C "$ROOT/repo" rev-parse HEAD)" +total_end="$(timestamp)" +printf 'BENCH_PHASE\ttotal\t%s\n' "$(( (total_end - total_start) / 1000000 ))"