Seorang pengembang menemukan bahwa menyambungkan debugger Chrome DevTools melalui Playwright atau Puppeteer memperlambat unggahan berbasis fetch hingga lebih dari 20 kali lipat, mengubah tolok ukur performa sehari-hari menjadi data yang menyesatkan.

Teka-teki yang memicu investigasi

Coffer, sebuah penyimpanan file berbasis browser yang mengenkripsi data sebelum mengirimkannya ke server, secara rutin melakukan unggahan kelas gigabit melalui jaringan lokal. Saat tim mengukur kecepatan unggah, mereka melihat adanya kesenjangan: unduhan memenuhi kapasitas tautan, tetapi unggahan berjalan sangat lambat pada sekitar seperdelapan dari bandwidth yang tersedia. Perbedaan ini memicu tiga putaran perubahan kode yang gagal memberikan hasil, hingga sebuah "perbaikan" keempat tampak memberikan lonjakan besar—namun hilang begitu saja saat debugger dilepas.

Apa yang dicoba tim pertama kali

Para insinyur mencari penyebab yang biasa dicurigai:

  • Ukuran chunk – Melipatgandakan blok dari 16 MiB menjadi 32 MiB tidak mengubah throughput.
  • Pipelining – Menumpuk enkripsi blok berikutnya dengan unggahan saat ini memberikan peningkatan moderat sebesar 13%, yang tidak dapat dibedakan dari noise pengukuran.
  • Konkurensi – Menjalankan beberapa unggahan secara paralel tetap tertahan pada kecepatan total yang sama, menunjukkan adanya batas global.

Tidak satu pun dari variasi ini yang menjelaskan perlambatan 8× tersebut.

Perbandingan head-to-head yang mengejutkan

Untuk mengisolasi masalah, tim mengganti implementasi klien. Menggunakan .NET HttpClient, mereka mencatat 700 Mbps pada jaringan yang sama; permintaan yang sama yang dilakukan dari API fetch() Chromium tertahan di 140 Mbps. Kontras yang tajam ini menunjukkan bahwa network stack browser adalah penyebabnya—sampai eksperimen berikutnya membuktikan sebaliknya.

Biaya tersembunyi dari debugger

Playwright dan Puppeteer menggerakkan Chrome melalui Chrome DevTools Protocol (CDP). Protokol tersebut menyambungkan debugger ke proses browser, mengekspos peristiwa jaringan, snapshot DOM, dan log konsol. Tim menjalankan tes terfokus: sebuah panggilan fetch() yang mengirimkan payload Uint8Array, sekali dengan debugger CDP terpasang dan sekali tanpa.

  • Debugger terpasang: 113 Mbps

Kehadiran debugger mengurangi kecepatan unggah lebih dari 20×. Tes manual di jendela Edge biasa—tanpa debugger terpasang—mencapai 600+ Mbps, mengonfirmasi bahwa browser itu sendiri dapat menangani lalu lintas data saat tidak terbebani.

Peningkatan nyata yang moderat

Meskipun debugger menjadi penyebab utama perlambatan, tim tetap menemukan optimasi yang nyata: mengubah request body dari Uint8Array ke Blob meningkatkan kecepatan Chromium sekitar 30%. Ini adalah penyesuaian yang berguna, tetapi jauh dari lonjakan "ajaib" yang diharapkan sebelumnya.

Mengapa ini penting bagi para insinyur

  • Instrumen bisa berbohong. Alat performa yang mengotomatisasi browser adalah bagian dari rantai pengukuran itu sendiri.
  • Benchmark yang tampak mustahil layak untuk diperiksa kembali (sanity check). Jika angka menyimpang jauh dari kapasitas jaringan, lingkungan pengukuran harus menjadi tersangka pertama.
  • Hasil nihil itu berharga. Mengonfirmasi bahwa sebuah perubahan tidak memberikan efek apa pun mencegah pemborosan upaya dalam mengejar bug semu.
  • Kontrol manual adalah asuransi yang murah. Menjalankan operasi yang sama di jendela browser biasa dapat mengungkap overhead instrumentasi yang tersembunyi.

Sudut pandang lain: saat debugger sangat diperlukan

Debugger memberikan visibilitas ke perilaku halaman, jejak kesalahan (error traces), dan lini masa jaringan yang jika tidak menggunakan debugger tidak akan bisa diakses. Untuk pengujian regresi, audit keamanan, atau interaksi UI yang kompleks, menyambungkan debugger CDP sering kali tidak bisa ditawar. Kuncinya adalah memisahkan pengujian fungsional dari pengukuran performa murni, dan menonaktifkan debugger ketika pengukuran performa adalah tujuannya.

Kesimpulan: Alat yang memungkinkan pengujian otomatis juga dapat menjadi sumber distorsi performa terbesar. Sebelum menyalahkan browser, jaringan, atau kode, pastikan tidak ada debugger yang secara diam-diam membatasi (throttling) aliran data.