Optimalkan Kecepatan Iterasi

Laporkan masalah Lihat sumber

Halaman ini menjelaskan cara mengoptimalkan performa build Bazel saat menjalankan Bazel berulang kali.

Status Runtime Bazel

Pemanggilan Bazel melibatkan beberapa bagian yang berinteraksi.

  • Antarmuka command line (CLI) bazel adalah alat front-end yang ditampilkan kepada pengguna dan menerima perintah dari pengguna.

  • Alat CLI memulai server Bazel untuk setiap basis output yang berbeda. Server Bazel umumnya bersifat persisten, tetapi akan mati setelah beberapa waktu tidak ada aktivitas agar tidak membuang resource.

  • Server Bazel melakukan langkah-langkah pemuatan dan analisis untuk perintah tertentu (build, run, cquery, dll.), yang mana server tersebut membuat bagian-bagian yang diperlukan dari grafik build dalam memori. Struktur data yang dihasilkan dipertahankan di server Bazel sebagai bagian dari cache analisis.

  • Server Bazel juga dapat melakukan eksekusi tindakan, atau dapat mengirim tindakan untuk eksekusi jarak jauh jika disiapkan untuk melakukannya. Hasil eksekusi tindakan juga disimpan dalam cache, yaitu dalam cache tindakan (atau cache eksekusi, yang dapat berupa lokal atau jarak jauh, dan mungkin dibagikan di antara server Bazel).

  • Hasil pemanggilan Bazel akan tersedia di hierarki output.

Menjalankan Bazel Secara Berulang

Dalam alur kerja developer umum, membuat (atau menjalankan) potongan kode berulang kali, sering kali dengan frekuensi yang sangat tinggi (misalnya untuk mengatasi beberapa error kompilasi atau menyelidiki pengujian yang gagal). Dalam situasi ini, pemanggilan bazel yang berulang harus memiliki overhead yang sesedikit mungkin sehubungan dengan tindakan berulang yang mendasarinya (misalnya, memanggil compiler, atau menjalankan pengujian).

Dengan mempertimbangkan hal ini, kita melihat kembali status runtime Bazel:

{i>Cache<i} analisis adalah bagian penting dari data. Sejumlah waktu dapat dihabiskan hanya untuk fase pemuatan dan analisis dari cold run (yaitu, run tepat setelah server Bazel dimulai atau saat cache analisis dihapus). Untuk satu cold build yang berhasil (misalnya, untuk rilis produksi), biaya ini cukup besar, tetapi untuk mem-build target yang sama berulang kali, biaya ini harus diamortisasi dan tidak diulang pada setiap pemanggilan.

Cache analisis tidak stabil Pertama, ini adalah bagian dari status dalam proses server Bazel, sehingga kehilangan server akan kehilangan cache. Namun, cache juga dibatalkan dengan sangat mudah: misalnya, banyak tanda command line bazel menyebabkan cache dihapus. Hal ini karena banyak flag yang memengaruhi grafik build (mis. karena atribut yang dapat dikonfigurasi). Beberapa perubahan flag juga dapat menyebabkan server Bazel dimulai ulang (mis., mengubah opsi startup).

Cache eksekusi yang baik juga penting untuk performa build. Cache eksekusi dapat disimpan secara lokal di disk, atau dari jarak jauh. Cache dapat dibagikan antar-server Bazel, dan tentu saja di antara developer.

Menghindari penghapusan cache analisis

Bazel akan mencetak peringatan jika cache analisis dihapus atau server dimulai ulang. Salah satu dari hal berikut harus dihindari selama penggunaan iteratif:

  • Sebaiknya jangan ubah flag bazel di tengah alur kerja iteratif. Misalnya, menggabungkan bazel build -c opt dengan bazel cquery akan menyebabkan setiap perintah menghapus cache analisis yang lain. Secara umum, coba gunakan sekumpulan flag tetap selama durasi alur kerja tertentu.

  • Kehilangan server Bazel akan menghilangkan cache analisis. Server Bazel memiliki waktu tidak ada aktivitas yang dapat dikonfigurasi, setelah itu server akan dimatikan. Anda dapat mengonfigurasi kali ini melalui file bazelrc agar sesuai dengan kebutuhan Anda. Server juga dimulai ulang saat tanda startup berubah. Jadi, sekali lagi, hindari mengubah flag tersebut jika memungkinkan.

  • Berhati-hatilah bahwa server Bazel akan dimatikan jika Anda menekan Ctrl-C berulang kali saat Bazel berjalan. Anda mungkin tergoda untuk mencoba menghemat waktu dengan mengganggu build yang sedang berjalan yang tidak lagi diperlukan, tetapi hanya tekan Ctrl-C satu kali untuk meminta akhir yang lancar dari pemanggilan saat ini.

  • Jika ingin menggunakan beberapa kumpulan tanda dari ruang kerja yang sama, Anda dapat menggunakan beberapa basis output yang berbeda, yang dialihkan dengan tanda --output_base. Setiap basis output mendapatkan server Bazel-nya sendiri.

Untuk membuat kondisi ini sebagai error, bukan peringatan, Anda dapat menggunakan flag --noallow_analysis_cache_discard (diperkenalkan di Bazel 6.4.0)