Optimalkan Kecepatan Iterasi

Laporkan masalah Lihat sumber Per malam · 7,2 · 7,1 · 7,0 · 6,5 · 6,4

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 tetap ada, tetapi akan dimatikan setelah beberapa saat tidak ada aktivitas waktu agar tidak membuang-buang sumber daya.

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

  • Server Bazel juga dapat melakukan eksekusi tindakan, atau dapat mengirim {i>action off<i} untuk eksekusi jarak jauh jika diatur untuk melakukannya. Hasil eksekusi tindakan juga di-cache, yaitu di cache tindakan (atau cache eksekusi, yang dapat bersifat lokal atau jarak jauh, dan dapat dibagikan di antara server Bazel).

  • Hasil pemanggilan Bazel akan tersedia di hierarki output.

Menjalankan Bazel secara Iteratif

Dalam alur kerja developer umumnya, membangun (atau menjalankan) potongan kode adalah hal yang umum berulang kali, sering kali dengan frekuensi yang sangat tinggi (misalnya, untuk menyelesaikan beberapa kompilasi error atau menyelidiki pengujian yang gagal). Dalam situasi ini, penting bahwa panggilan berulang bazel memiliki overhead seminimal mungkin dibandingkan dengan tindakan berulang yang mendasarinya (misalnya, memanggil compiler, atau menjalankan pengujian).

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

{i>Cache<i} analisis adalah bagian data yang penting. Waktu yang lama dapat hanya digunakan untuk fase pemuatan dan analisis dari cold run (yaitu run hanya setelah server Bazel dimulai atau saat {i>cache<i} analisis dihapus). Untuk satu cold build yang sukses (mis. untuk rilis produksi), biayanya adalah tertahankan, tetapi untuk berulang kali membangun target yang sama, penting bahwa diamortisasi dan tidak diulang pada setiap pemanggilan.

Cache analisis agak tidak stabil. Pertama, ini adalah bagian dari proses keadaan server Bazel, jadi kehilangan server akan menghilangkan {i>cache<i}. Namun, cache juga dibatalkan dengan sangat mudah: misalnya, banyak tanda command line bazel menyebabkan cache dihapus. Ini karena banyak flag yang memengaruhi build grafik (misalnya, karena atribut yang dapat dikonfigurasi). Beberapa tanda perubahan juga dapat menyebabkan server Bazel dimulai ulang (mis. mengubah opsi startup).

Cache eksekusi yang baik juga bermanfaat untuk performa build. Eksekusi dapat disimpan secara lokal pada disk, atau dari jarak jauh. Cache dapat dibagikan di antara Server Bazel, dan memang di kalangan pengembang.

Menghindari menghapus cache analisis

Bazel akan mencetak peringatan jika {i>cache<i} analisis dihapus atau server dimulai ulang. Kedua hal berikut ini harus dihindari selama penggunaan berulang:

  • Berhati-hatilah saat mengubah tanda bazel di tengah proses yang iteratif alur kerja. Misalnya, menggabungkan bazel build -c opt dengan bazel cquery menyebabkan setiap perintah membuang {i>cache<i} analisis yang lain. Secara umum, mencoba menggunakan set penanda yang tetap untuk durasi alur kerja tertentu.

  • Kehilangan server Bazel akan kehilangan cache analisis. Server Bazel memiliki tidak ada aktivitas yang dapat dikonfigurasi setelah itu, komputer akan mati. Anda dapat mengonfigurasi waktu ini melalui bazelrc yang sesuai dengan kebutuhan Anda. Server juga dimulai ulang saat memulai flag berubah, jadi sekali lagi, hindari mengubah flag tersebut jika memungkinkan.

  • Hati-hati bahwa server Bazel akan dimatikan jika Anda menekan Ctrl-C berulang kali saat Bazel berjalan. Anda tergoda untuk mencoba menghemat waktu dengan menginterupsi build yang sedang berjalan yang tidak lagi diperlukan, tetapi hanya menekan Ctrl-C sekali untuk meminta akhir panggilan saat ini dengan halus.

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

Untuk membuat kondisi ini sebagai kesalahan, bukan peringatan, Anda dapat menggunakan metode Flag --noallow_analysis_cache_discard (diperkenalkan di Bazel 6.4.0)