شعار زيفيرنت

هل نموذجك العقلي لخطوط أنابيب باش خاطئ؟

التاريخ:

واجه [مايكل لينش] موقفًا غريبًا. لماذا تم تجميع ثم تشغيل برنامجه ما يقرب من 10x أسرع من مجرد تشغيل البرنامج بنفسه؟ واجه [مايكل] هذه المشكلة أثناء تقييم مشروع برمجي، وقلصه إلى أساسياته الخاصة بالتكرار والتحليل، واكتشف أنه سلط الضوء على نموذج عقلي غير صحيح لكيفية عمل خطوط أنابيب bash.

هذا هو الوضع. أول شيء يفعله برنامج [مايكل] المختصر هو بدء تشغيل المؤقت. ثم يقوم ببساطة بقراءة وحساب بعض البايتات من 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 هو أن الأول يجمع الكود، ثم يقوم بتشغيله على الفور. والثاني يقوم ببساطة بتشغيل البرنامج المترجم.

كيف يمكن إضافة خطوة ترجمة إضافية تخفيض وقت التنفيذ؟ تبين أن النموذج العقلي لـ [مايكل] لكيفية عمل خطوط أنابيب باش كان غير صحيح، وهو يقوم بعمل رائع موضحًا كيف تعمل فعليًا، ولماذا تسبب ذلك في السلوك الغريب كان يرى.

باختصار، لا يتم إطلاق الأوامر في مسار bash بشكل تسلسلي. يتم إطلاقها جميعًا في نفس الوقت وتنفيذها بالتوازي. وهذا يعني أنه عند تشغيله مباشرة، يتم تشغيل برنامج عداد البايت الخاص بـ [مايكل] على الفور. ثم انتظرت دون القيام بأي شيء لمدة 150 ميكروثانية تقريبًا echo '00010203040506070809' | xxd -r -p قام جزء من خط الأنابيب بتسليم بياناته ليقرأها البرنامج. هذا هو المكان الذي يأتي منه وقت التنفيذ الإضافي عند تشغيل الإصدار المترجم بالفعل.

فلماذا يتم تجميعه أولاً بشكل أسرع؟ نفس السبب الأساسي: عندما zig build run عندما يبدأ الأمر، فإنه يقضي بعض الوقت في تجميع البرنامج أولاً. ثم عندما يتم تشغيل البرنامج المترجم فعليًا (ويبدأ مؤقت التنفيذ)، تكون بيانات الإدخال من خط أنابيب bash جاهزة بالفعل. لذلك، يتم تنفيذ البرنامج الذي تم تجميعه حديثًا في وقت أقل لأنه لا ينتظر إتاحة البيانات من وقت سابق في المسار.

إنها نظرة مثيرة للاهتمام حول كيفية عمل خطوط أنابيب bash فعليًا تحت الغطاء، ونحن سعداء بالتفاصيل التي وضعها [مايكل] في الرحلة بأكملها والشرح. عاجلاً أم آجلاً، ستظهر تفاصيل مثل هذه وتتسبب في إثارة بعض الدهشة، مثل المستخدم الذي اكتشفها حالات الحافة المزعجة فيما يتعلق بالمسافات في أوامر ssh.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة