इस पेज पर, Bazel को बार-बार चलाने पर, उसके बिल्ड की परफ़ॉर्मेंस को ऑप्टिमाइज़ करने का तरीका बताया गया है.
Bazel का रनटाइम स्टेट
Bazel को शुरू करने के लिए, कई हिस्सों के बीच इंटरैक्शन की ज़रूरत होती है.
bazelकमांड-लाइन इंटरफ़ेस (सीएलआई) एक ऐसा टूल है जिसका इस्तेमाल उपयोगकर्ता करते हैं. यह उपयोगकर्ताओं से निर्देश लेता है.सीएलआई टूल, हर अलग-अलग आउटपुट बेस के लिए एक Bazel सर्वर शुरू करता है. Bazel सर्वर आम तौर पर चालू रहता है. हालांकि, कुछ समय तक इस्तेमाल न होने पर, यह बंद हो जाता है, ताकि संसाधनों का इस्तेमाल न हो.
Bazel सर्वर, दिए गए निर्देश (
build,run,cqueryवगैरह) के लिए, लोड करने और विश्लेषण करने के चरण पूरे करता है. इस दौरान, यह मेमोरी में बिल्ड ग्राफ़ के ज़रूरी हिस्से बनाता है. इसके बाद, डेटा स्ट्रक्चर को Bazel सर्वर में विश्लेषण कैश के तौर पर सेव किया जाता है.Bazel सर्वर, कार्रवाई को पूरा भी कर सकता है. इसके अलावा, अगर इसे ऐसा करने के लिए सेट अप किया गया है, तो यह कार्रवाइयों को रिमोट तरीके से पूरा करने के लिए भेज सकता है. कार्रवाइयों को पूरा करने के नतीजों को भी कैश किया जाता है. इन्हें ऐक्शन कैश (या एक्ज़ीक्यूशन कैश, जो स्थानीय या रिमोट हो सकता है और इसे Bazel सर्वर के बीच शेयर किया जा सकता है) में सेव किया जाता है.
Bazel को शुरू करने का नतीजा, आउटपुट ट्री में उपलब्ध होता है.
Bazel को बार-बार चलाना
डेवलपर के सामान्य वर्कफ़्लो में, कोड के किसी हिस्से को बार-बार बिल्ड (या रन) करना आम बात है.ऐसा अक्सर बहुत ज़्यादा फ़्रीक्वेंसी पर किया जाता है. उदाहरण के लिए, कंपाइलेशन से जुड़ी किसी गड़बड़ी को ठीक करने या किसी टेस्ट के फ़ेल होने की वजह जानने के लिए. ऐसे में, यह ज़रूरी है कि bazel को बार-बार शुरू करने पर, बार-बार की जाने वाली कार्रवाई (उदाहरण के लिए, कंपाइलर को शुरू करना या टेस्ट को पूरा करना) के मुकाबले, कम से कम ओवरहेड हो.
इसे ध्यान में रखते हुए, हम Bazel के रनटाइम स्टेट पर एक बार फिर से नज़र डालते हैं:
विश्लेषण कैश, डेटा का अहम हिस्सा है. कोल्ड रन (यानी, Bazel सर्वर शुरू होने के तुरंत बाद या विश्लेषण कैश को खारिज किए जाने पर किया गया रन) के लोड करने और विश्लेषण के चरणों में ही काफ़ी समय लग सकता है. एक बार, कोल्ड बिल्ड को सफलतापूर्वक पूरा करने (उदाहरण के लिए, प्रोडक्शन रिलीज़ के लिए) पर, यह लागत बर्दाश्त की जा सकती है. हालांकि, एक ही टारगेट को बार-बार बिल्ड करने के लिए, यह ज़रूरी है कि इस लागत को कम किया जाए और हर बार Bazel को शुरू करने पर, यह लागत न लगे.
विश्लेषण कैश, काफ़ी अस्थिर होता है. सबसे पहले, यह Bazel सर्वर की इन-प्रोसेस स्टेट का हिस्सा होता है. इसलिए, सर्वर के बंद होने पर, कैश भी बंद हो जाता है. हालांकि, कैश को अमान्य भी बहुत आसानी से किया जा सकता है. उदाहरण के लिए, bazel कमांड लाइन के कई फ़्लैग की वजह से, कैश को खारिज कर दिया जाता है. ऐसा इसलिए होता है, क्योंकि कई फ़्लैग, बिल्ड
ग्राफ़ पर असर डालते हैं. उदाहरण के लिए,
कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूटकी वजह से. कुछ फ़्लैग
में बदलाव करने पर, Bazel सर्वर को रीस्टार्ट भी किया जा सकता है. उदाहरण के लिए,
स्टार्टअप के विकल्पों में बदलाव करने पर.
बिल्ड की परफ़ॉर्मेंस के लिए, अच्छा एक्ज़ीक्यूशन कैश भी ज़रूरी है. एक्ज़ीक्यूशन कैश को स्थानीय तौर पर डिस्क पर या रिमोट तरीके से सेव किया जा सकता है. कैश को Bazel सर्वर के साथ-साथ, डेवलपर के बीच भी शेयर किया जा सकता है.
विश्लेषण कैश को खारिज करने से बचें
अगर विश्लेषण कैश को खारिज कर दिया गया है या सर्वर को रीस्टार्ट किया गया है, तो Bazel एक चेतावनी दिखाएगा. बार-बार इस्तेमाल करने के दौरान, इनमें से किसी भी कार्रवाई से बचना चाहिए:
बार-बार इस्तेमाल करने वाले वर्कफ़्लो के बीच में,
bazelफ़्लैग में बदलाव करने से बचें. उदाहरण के लिए,bazel build -c optकोbazel cqueryके साथ मिक्स करने पर, हर निर्देश दूसरे के विश्लेषण कैश को खारिज कर देता है. आम तौर पर, किसी खास वर्कफ़्लो के दौरान, फ़्लैग के एक ही सेट का इस्तेमाल करने की कोशिश करें.Bazel सर्वर के बंद होने पर, विश्लेषण कैश भी बंद हो जाता है. Bazel सर्वर के लिए, इस्तेमाल न होने पर बंद होने का समय कॉन्फ़िगर किया जा सकता है . इसके बाद, यह बंद हो जाता है. अपनी ज़रूरत के हिसाब से, इस समय को bazelrc फ़ाइल के ज़रिए कॉन्फ़िगर किया जा सकता है. स्टार्टअप फ़्लैग में बदलाव करने पर भी सर्वर रीस्टार्ट हो जाता है. इसलिए, अगर मुमकिन हो, तो उन फ़्लैग में बदलाव करने से बचें.
ध्यान दें कि Bazel के चालू रहने के दौरान, Ctrl-C को बार-बार दबाने पर, Bazel सर्वर बंद हो जाता है. ऐसा हो सकता है कि आपको किसी ऐसे बिल्ड को बीच में रोकने की कोशिश करके समय बचाने का मन करे जिसकी अब ज़रूरत नहीं है. हालांकि, मौजूदा कार्रवाई को सही तरीके से खत्म करने का अनुरोध करने के लिए, Ctrl-C को सिर्फ़ एक बार दबाएं.
अगर आपको एक ही वर्कस्पेस से फ़्लैग के कई सेट इस्तेमाल करने हैं, तो
--output_baseफ़्लैग की मदद से, अलग-अलग आउटपुट बेस का इस्तेमाल किया जा सकता है. हर आउटपुट बेस के लिए, अपना Bazel सर्वर होता है.