לוגו זפירנט

האם המודל המנטלי שלך של Bash Pipelines שגוי?

תאריך:

[מייקל לינץ'] נתקל בסיטואציה מוזרה. למה הקומפילציה הריצה אז את התוכנית שלו כמעט פי 10 מהר יותר מאשר רק להפעיל את התוכנית לבד? [מייקל] נתקל בבעיה הזו בזמן ביצוע השוואת ביצועים של פרויקט תכנות, הוריד אותו ליסודותיו לחזרות ולניתוח, וגילה שהוא הדגיש מודל מנטלי שגוי של אופן פעולתו של צינורות 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 pipeline אינן מופעלות ברצף. כולם מושקים בו זמנית ומבוצעים במקביל. המשמעות היא שכאשר הרצה ישירות, תוכנית מונה הבתים של [מייקל] הושקה מיד. ואז הוא חיכה לא עושה הרבה במשך כ-150 מיקרו-שניות בזמן שה echo '00010203040506070809' | xxd -r -p חלק מהצינור הספיק לספק את הנתונים שלו כדי שהתוכנית תוכל לקרוא. מכאן מגיע זמן הביצוע הנוסף בעת הפעלת הגרסה שכבר הידור.

אז למה הקומפילציה תחילה פועלת מהר יותר? אותה סיבה בסיסית: כאשר ה zig build run הפקודה יוצאת לדרך, היא משקיעה מעט זמן בהידור התוכנית תחילה. לאחר מכן, כאשר תוכנית ההידור מופעלת בפועל (ומתחילה את טיימר הביצוע שלה), נתוני הקלט מצינור ה-bash כבר מוכנים. אז, התוכנית החדשה שהורכבה מופעלת בפחות זמן מכיוון שהיא לא יושבת ומחכה לנתונים ממוקדמים יותר בצנרת כדי להפוך לזמינים.

זה מבט מעניין על האופן שבו צינורות bash מתפקדים בפועל מתחת למכסה המנוע, ואנחנו שמחים מהפרטים שמכניסה [מייקל] לכל המסע וההסבר. במוקדם או במאוחר, פרטים כמו זה צצים וגורמים לכמה גבות להרים, כמו המשתמש שגילה מקרי קצה בעייתיים לגבי רווחים בפקודות ssh.

ספוט_ימג

המודיעין האחרון

ספוט_ימג