Sebagian besar klaim performa di ruang perangkat pengembangan JavaScript memiliki masa simpan yang cepat basi seperti susu. Seseorang menginstal beberapa paket pada Selasa pagi yang tenang, menangkap output terminal, dan menerbitkan diagram batang yang dramatis. Menjelang sprint berikutnya, salah satu alat telah merilis patch yang membuat semuanya tidak valid. Postingan tersebut tetap terindeks oleh mesin pencari. Diagram tersebut terus dibagikan. Namun, angka-angka tersebut sudah mulai membohongi Anda.
Inilah kerusakan yang menginfeksi hampir semua benchmark package manager. Mereka hanyalah fotografi acara, padahal yang kita butuhkan adalah siaran langsung.
Sebuah proyek bernama depjs/canary menangani masalah ini sebagai tanggung jawab mesin, bukan sebagai tugas kalender konten. Ini adalah benchmark yang hidup yang memantau npm, pnpm, Yarn, dan dep, lalu menjalankan ulang seluruh rangkaian pengujiannya saat salah satu dari mereka menerbitkan versi baru. Hasilnya bersifat publik, berkelanjutan, dan tidak terelakkan. Saat ada yang rusak, repositori akan tetap berwarna merah sampai masalahnya teratasi. Tidak ada cherry-picking, tidak ada upaya bersembunyi di balik postingan blog lama, dan tidak ada asumsi bahwa pemenang bulan lalu masih memegang mahkota.
Mengapa Klaim Kecepatan Membutuhkan Tanggal Kedaluwarsa
Package manager JavaScript tidak berdiam diri. Celah antara versi minor dapat mencakup penulisan ulang algoritma resolusi, perubahan strategi hoisting, atau perubahan pada cara kunci cache global dibuat. Sebuah benchmark yang menangkap npm 10.2.1 dan pnpm 8.11.0 hampir tidak memberi tahu Anda apa pun tentang bagaimana alat yang sama berperilaku dua rilis kemudian. Namun, web penuh dengan pernyataan definitif seperti "Alat X tiga kali lebih cepat" berdasarkan jenis snapshot statis seperti itu.
Lebih buruk lagi, banyak pengujian mengabaikan kondisi yang mendefinisikan kesulitan nyata bagi pengembang. Sebuah package manager mungkin melakukan instalasi dengan sangat cepat dalam lingkungan yang hangat dan sudah teruji, lalu melambat pada runner CI yang dimulai dengan disk kosong. Tanpa menguji kedua ekstrem tersebut, benchmark tersebut menjadi sekadar siaran pers alih-alih data teknik yang berguna.
Bagaimana Canary Mengotomatiskan Perbandingan
Setiap dua jam, sebuah job melakukan polling ke npm registry. Jika versi baru npm, pnpm, Yarn, atau dep muncul, canary akan terbangun. Ia tidak menunggu manusia untuk menyadari adanya changelog. Ia segera mengeksekusi matriks pengujian lengkap yang mengadu keempat manajer tersebut dengan lima paket dunia nyata yang populer. Pemilihannya mencakup pemain besar seperti React, Next.js, dan Vite, yaitu codebase yang diinstal oleh pengembang asli setiap hari. Ini bukan mikro-proyek sintetis yang dirancang untuk memuji satu alat tertentu.
Pendekatan yang dipicu oleh rilis ini sangat penting karena mengaitkan pengukuran secara langsung dengan perubahan. Jika benchmark hanya berjalan pada jadwal harian, ia mungkin melewatkan hotfix di tengah hari atau mengabaikan regresi selama berjam-jam. Dengan berjalan khusus pada versi baru, canary mengajukan pertanyaan langsung setiap saat: apakah rilis ini membuat segalanya lebih baik atau lebih buruk?
Empat Skenario yang Menguji Berbagai Aspek
Matriks pengujian dibangun di sekitar empat pengaturan berbeda yang memetakan langsung ke alur kerja yang akan Anda kenali.
- Cold cache, no lockfile. Ini adalah klon baru pada laptop baru, atau instalasi pertama setelah menghapus
node_modules. Tidak ada yang tersimpan di cache. Tidak ada yang dikunci. Package manager harus menyelesaikan, mengambil, dan menulis semuanya dari awal. - Warm cache, with lockfile. Ini adalah jalur ideal untuk integrasi berkelanjutan ketika semuanya berjalan lancar. Lockfile tersedia secara lokal, dan cache masih menyimpan tarballs dari proses sebelumnya. Alat tersebut harus bergerak cepat karena sebagian besar keputusan sudah dibuat.
- Cold cache, with lockfile. Di sini lockfile tersedia, tetapi cache telah dihapus. Manajer dapat melewati resolusi dependensi, namun tetap harus mengunduh setiap byte melalui jaringan. Ini memisahkan kecepatan jaringan dari kecepatan resolusi.
- Warm cache, no lockfile. Cache sudah hangat, tetapi lockfile hilang. Package manager harus menyelesaikan kembali pohon dependensi sebelum dapat mulai mengekstrak file. Ini menguji efisiensi solver dan parser metadata dalam kondisi jaringan yang ideal.
Setiap skenario dijalankan lima kali, dan canary menyimpan hasil mediannya. Pilihan tunggal tersebut menghilangkan banyak noise. Satu gangguan jaringan sesaat atau lonjakan singkat pada latensi registry tidak dapat mengambil alih narasi. Outlier akan diabaikan; pengalaman tipikal yang akan dicatat.
Smoke Test Lebih Baik daripada Timer Kosong
Raw speed is easy to fake if you do not verify the outcome. A package manager could skip postinstall steps, corrupt a few symlinks, or install the wrong versions and still post an impressive timestamp. The canary refuses to stop at the timer. After the installation finishes, it actually exercises the installed code.
For example, it boots up an Express application and confirms that the server starts listening on the expected port. If the code does not run, the benchmark fails outright. The smoke test transforms the suite from a race into an audit. It answers the question that speed alone cannot: does the installation actually work?
Radical Honesty as a Feature
The author of the canary wrote three rules into the process that most benchmark authors treat as optional.
Same playing field. Flags are used to normalize behavior across tools. If one package manager hides a performance flaw behind a default setting, the benchmark exposes it rather than letting the tool look good by accident.
Genuine cold starts. Before every single repetition, not just the first one, the npm cache and the pnpm store get wiped. That word "every" is doing heavy labor. Many benchmarks clear the cache once, then run five installs in a row. The second through fifth runs are not truly cold, and the numbers inflate accordingly. The canary starts from zero each time.
Public failure states. When a new release breaks something, the repository remains in a red failure state. It sits there on the front page, ugly and unresolved, until a fix ships. There is no silent suppression to keep the dashboard looking green. This policy forces visibility. A user evaluating tools can see not just which one is fastest, but which one stayed reliable over time.
Inspectability Is Non-Negotiable
A benchmark that you cannot reproduce is a campaign slogan. The canary addresses this with a single bash script that lets anyone run any slice of the suite locally. You do not need to trust a cloud provider’s networking or a maintainer’s hand-tweaked environment. If you suspect the numbers are off, you can generate your own.
That transparency also makes the project useful for maintainers. When a regression hits, a downstream developer can pull the script, bisect the tool’s releases, and hand the upstream team a
