जेफिरनेट लोगो

क्या बैश पाइपलाइनों का आपका मानसिक मॉडल गलत है?

दिनांक:

[माइकल लिंच] को एक अजीब स्थिति का सामना करना पड़ा। फिर संकलन क्यों कर रहा था और अपना प्रोग्राम लगभग 10x चला रहा था और तेज केवल प्रोग्राम को स्वयं चलाने से? [माइकल] को एक प्रोग्रामिंग प्रोजेक्ट को बेंचमार्क करते समय इस समस्या का सामना करना पड़ा, इसे दोहराव और विश्लेषण के लिए इसकी अनिवार्यताओं तक सीमित कर दिया, और पाया कि इसने एक गलत मानसिक मॉडल को उजागर किया कि बैश पाइपलाइन कैसे काम करती है।

यहाँ स्थिति है. पहली चीज़ जो [माइकल] का संक्षिप्त कार्यक्रम करता है वह है टाइमर शुरू करना। फिर यह बस कुछ बाइट्स पढ़ता है और गिनता है stdin, फिर प्रिंट करता है कि ऐसा होने में कितना समय लगा। परीक्षण प्रोग्राम को निम्न प्रकार से चलाने पर लगभग 13 माइक्रोसेकंड का समय लगता है।

$ echo '00010203040506070809' | xxd -r -p | zig build run -Doptimize=ReleaseFast
bytes: 10
execution time: 13.549µs

(पहले से संकलित) प्रोग्राम को सीधे चलाने पर, निष्पादन समय 162 माइक्रोसेकंड तक बढ़ जाता है।

$ echo '00010203040506070809' | xxd -r -p | ./zig-out/bin/count-bytes
bytes: 10
execution time: 162.195µs

फिर, बीच में केवल एक ही अंतर है zig build run और ./zig-out/bin/count-bytes वह यह है कि पहले कोड संकलित करता है, फिर उसे तुरंत चलाता है। दूसरा बस संकलित प्रोग्राम चलाता है।

एक अतिरिक्त संकलन चरण कैसे जोड़ा जा सकता है? कमी निष्पादन का समय? पता चला कि [माइकल] का बैश पाइपलाइन कैसे काम करता है इसका मानसिक मॉडल गलत था, और वह बहुत अच्छा काम करता है यह समझाते हुए कि वे वास्तव में कैसे काम करते हैं, और यह अजीब व्यवहार का कारण क्यों है वह देख रहा था.

संक्षेप में, बैश पाइपलाइन में कमांड क्रमिक रूप से लॉन्च नहीं किए जाते हैं। वे सभी एक ही समय में लॉन्च होते हैं और समानांतर में निष्पादित होते हैं। इसका मतलब यह था कि जब सीधे चलाया जाता है, तो [माइकल] का बाइट-काउंटर प्रोग्राम तुरंत लॉन्च हो जाता है। फिर यह लगभग 150 माइक्रोसेकंड तक कुछ खास न करते हुए इंतजार करता रहा echo '00010203040506070809' | xxd -r -p पाइपलाइन का एक हिस्सा प्रोग्राम को पढ़ने के लिए अपना डेटा देने में लग गया। पहले से संकलित संस्करण को चलाने पर अतिरिक्त निष्पादन समय यहीं से आता है।

तो पहले इसे संकलित करने का कार्य तेजी से क्यों चल रहा है? वही मूल कारण: जब zig build run कमांड शुरू होता है, यह पहले प्रोग्राम को संकलित करने में थोड़ा समय खर्च करता है। फिर जब संकलित प्रोग्राम वास्तव में लॉन्च होता है (और इसका निष्पादन टाइमर शुरू होता है), तो बैश पाइपलाइन से इनपुट डेटा पहले से ही तैयार होता है। इसलिए, ताज़ा संकलित प्रोग्राम कम समय में निष्पादित होता है क्योंकि यह पाइपलाइन में पहले से उपलब्ध डेटा के उपलब्ध होने की प्रतीक्षा में नहीं बैठा रहता है।

यह एक दिलचस्प नज़र है कि बैश पाइपलाइन वास्तव में हुड के नीचे कैसे काम करती है, और हम पूरी यात्रा और स्पष्टीकरण में [माइकल] द्वारा दिए गए विवरण से खुश हैं। देर-सबेर, इस तरह के विवरण सामने आते हैं और कुछ लोगों की भौंहें तन जाती हैं, जैसे उस उपयोगकर्ता की जिसने खोज की थी एसएसएच कमांड में रिक्त स्थान के संबंध में परेशानी वाले किनारे के मामले.

स्पॉट_आईएमजी

नवीनतम खुफिया

स्पॉट_आईएमजी