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, menggabungkanbazel build -c opt
denganbazel 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.