ביצועי יישומים

[הועבר לארכיב] עדכון אחרון על-ידי Joe Schaefer ב-יום ג׳, 23 אפר׳ 2024    מקור
 

מפתחים רבים נופלים למלכודת של חשיבה אופטימיזציה ביצועים היא על הפיכת כל שורת קוד ליעילה ככל האפשר.

זה בעצם ההיפך. אתה מתחיל עם האילוצים הארכיטקטוניים של היישום, ולהשתמש בהם כדי לתחקר מטה לחלק “האיטי” שנצפה של התוכנית. הטמעה של חלק זה מנחה את כל אפשרויות הביצועים האחרות שעליך לבצע. כל דבר שאינו איטי כמו החלק הזה, לא צריך להיות אופטימי יותר. במקום זאת, להתמקד בביטוי האנושי ובפשטות ובהירות היישום, לקוראים שאינם מומחים על פני פורטל ראשי

אתה יכול לחזור על ספר המשחקים הזה, אבל מעולם לא הייתי צריך ללכת מעבר 3 איטרציות בקריירה המקצועית שלי.

אז קדימה ולהשתמש בשפת תכנות אלגנטית כמו Python3 או יבאסקריפט/כתב סוגים, ולתת למומחי הנושא (SME) שם בחוץ בעולם הקוד הפתוח לתת לך עוצמה ג'/C+++

אפילו סקריפט קש נטול תלות הוא פתרון מעשי עבור משימות בסיסיות רבות. הנה אחד שכתבתי לחברת Augmented Reality קפיצת קסם לפני כמה שנים, להחליף את החרדים OpenGrok שירות עם משהו שממנף מקבילות מרובות מעבדים עם xargs - זכאים, ותומך חשבון שותפים חיפוש פשוט אמקס/וים

https://github.com/joesuf4/home/blob/wsl/bin/pffxg.sh

תסריט זה הוא סדר גודל מהיר יותר מהחשודים הרגילים ב-GitHub, שכולם נכתבו בשפות תכנות סטטיות ומהודרות. אבל על ידי זיהוי צוואר הבקבוק המדויק ב באש (נפתח בנפח גבוה) מזלג+ביצוע שיחות באמצע, ושימוש סרגלים במקום זאת, אתה מקבל תסריט שנראה הרבה כמו זה, עם אלגוריתם הליבה מיושם ב 10 שורות של מעטפת

הוא גם משתמש בקהילת הקוד הפתוח של SME‘s בצורה חכמה, במקום בדרך שבה מימושים אחרים של “צמחייה רקורסיבית מסוננת” ב-GitHub עשו זאת. במקום לאמץ באופן פנימי ולשמור על יישום משלי (הליכי משנה) של חיפוש, סרגלים, וגם ירוקcolor, אני פשוט עושה שימוש חוזר בקובצי ההפעלה המותקנים מראש שSME‘s מתאימים במיוחד במשך עשרות שנים כפי שהם. אני לא צריך לשלוט ביישום שלהם, רק לעשות שימוש חוזר שלהם. ממשק לקוח

כדי לראות את ההתמודדות ההפוכה, שבה הכל נעשה בתוך הבית, ממוטב לחלוטין, ועדיין לא ניתן לנצח את התסריט הזה עם אפשרויות חיפוש ברירת המחדל, ואין מערכת כתיבה למטמון זמינה, הנה דוגמה מצוינת https://github.com/BurntSushi/ripgrep

רק כדי למשוך את #performance #benchmark הראשון מדף זה, ולהגדיל אותו מגודל עץ מדגם צעצוע (מקורות ליבה לינוקס), לעץ הטרוגני כי הוא 23GB(הריצות הטובות ביותר לאחר 3 חזרות; שפה=en_US.UTF-8

    % du -sh .
    23G .
    % time rg -uuniw '[A-Z]+_SUSPEND' | wc -l
    6259
    rg -uuniw '[A-Z]+_SUSPEND' 9.46s user 16.08s system 261% cpu 9.759 total
    wc -l 0.00s user 0.07s system 0% cpu 9.759 total
    % time pffxg.sh -- -wnE '[A-Z]+_SUSPEND' | wc -l
    5855
    pffxg.sh -- -wnE '[A-Z]+_SUSPEND' 16.66s user 2.68s system 429% cpu 4.501 total
    wc -l 0.00s user 0.00s system 0% cpu 4.501 total

זה די טיפשי למיקרו-אופטימיזציה של משהו שקשור באופן עמוק למצב של מטמון מערכת הקבצים של הליבה לחיפוש שלך. הווריאציה בתזמוני הביצועים נשלטת על ידי מהירות הגישה לגוף התוכן של הקבצים, וזה בסדר גודל רלוונטי יותר מכל גורם אחר לתוצאות הסיום. להיות על NVMe עוזר, אבל שום דבר בחלל הזה לא פועם זיכרון

זו הסיבה שיש מטמון בזיכרון, דחוס עבור corpus גדול של קבצים, יתייצב את זמני הביצועים. זה מפתיע שאף אחד אחר לא חשב שזה מספיק חשוב כדי לתמוך.

הסר את #performance #benchmark השני מדף זה, והגדל אותו כמו קודם (אותו הדבר) 23GB

    % time rg -tc -uuuiwn '[A-Z]+_SUSPEND' | wc -l
    5629
    rg -tc -uuuiwn '[A-Z]+_SUSPEND' 3.51s user 1.71s system 1141% cpu 0.457 total
    wc -l 0.00s user 0.05s system 11% cpu 0.457 total
    % time LANG=C pffxg.sh --cache /tmp/pffxg-$USER --workers 32 --cc -- -wE '[A-Z]+_SUSPEND' | wc -l
    5628
    LANG=C pffxg.sh --cache /tmp/pffxg-$USER --workers 32 --cc -- -wE  3.14s user 0.88s system 1055% cpu 0.381 total
    wc -l 0.00s user 0.00s system 0% cpu 0.381 total

מכוונן pffxg.sh הוא עדיין מהיר יותר, למרות כל העבודה שהוכנסה microoptimizing ripgrep עבור זה ג'

הדרך בה השתמשתי בתסריט הזה AOSP (חברה) היה צריך לתזמן a הסכם רכש חוזר סנכרון ואח”כ pffxg.sh **לוזופ-זרע למטמון דחוס אלטמפסים* לרוץ כל בוקר לפני העבודה (דרך) קרונטאב), עם PFFXG_CACHE=... הגדר ב-My ~/.pffxg.conf קובץ. כך כל pffxg.sh הפעלות שהפעלתי במהלך יום העבודה ישתמשו במטמון הדחוס ב טמפסים

25M LOC בין ripgrep וגם ugrep632 LOC עבור pffxg.sh

כי זו תוכנית קטנה כל כך, pffxg.sh יכול לתת לך ווים חזקים לתוך הפנים שלה עם כמעט אפס מאמץ. אפילו את ירוקcolor הפקודה עצמה ניתנת להתאמה אישית: כל פקודה שאתה צריך להריץ על corpus נבחר של קבצים, שיכול לקבל רשימה של שמות קבצים המצורפים לסוף הטיעונים שלה, הוא משחק הוגן. הנה “ספירת שורות כוללת ב MiLOC

    % time find * -type f | xargs wc -l | awk '{ $2 == "total" {a+=$1} END {print a/1024**2}'
    28.451
    find * -type f 0.00s user 0.06s system 2% cpu 2.733 total
    xargs wc -l 0.53s user 1.02s system 54% cpu 2.853 total
    awk '$2 == "total" {a+=$1} END {print a/1024**2}' 0.23s user 0.59s system 28% cpu 2.853 total

    % time pffxg.sh --workers 8 --cmd wc --all -- -l | awk '{$2 == "total" {a+=$1} END {print a/1024**2}'
    28.4506
    pffxg.sh --workers 8 --cmd wc --all -- -l 0.92s user 0.66s system 826% cpu 0.192 total
    awk '$2 == "total" {a+=$1} END {print a/1024**2}' 0.02s user 0.00s system 11% cpu 0.192 total

ripgrep

    % time rg -c \$ | awk -F : '{a+=$2} END {print a/1024**2}'
    28.4284
    rg -c \$ 2.12s user 2.19s system 276% cpu 1.564 total
    awk -F : '{a+=$2} END {print a/1024**2}' 0.58s user 0.45s system 66% cpu 1.564 total

כאן הוא מוגבל ל ג'

    % time pffxg.sh --workers 8 --cc --cmd wc -- -l | awk '$2 == "total" {a+=$1} END {print a/1024**2}'
    25.3935
    pffxg.sh --workers 8 --cc --cmd wc -- -l 0.76s user 0.54s system 734% cpu 0.177 total
    awk '$2 == "total" {a+=$1} END {print a/1024**2}' 0.02s user 0.00s system 9% cpu 0.177 total

וגם ripgrep

    % time rg -tc -c \$ | awk -F : '{a+=$2} END {print a/1024**2}'
    25.3844
    rg -tc -c \$ 3.49s user 1.54s system 441% cpu 1.140 total
    awk -F : '{a+=$2} END {print a/1024**2}' 0.38s user 0.38s system 66% cpu 1.140 total

Real Application Performance מגיע משיטות האיזון, הגמישות והתכנות הפונקציונלי; הוא לא מגיע מתיקון על טקטיקות מיקרו-אופטימיזציה הכרחיות בשפות תכנות סטטיות ומהודרות שהן דוב לעבוד איתו מנקודת המבט של האיזון והגמישות. שפות כה מוגזמות, הכרחיות הן מטרות נהדרות לתחומי בעיות מאוד ספציפיים, אך הן נוראיות לביצועי יישומים ברחבי המערכת.

pffxg.sh זה לא מוצר, וזה לא מכירות. “זו דוגמה” כדי להמחיש את הנקודה שלי בצורה דרמטית מאוד. אם אתה מכיר את ההיסטוריה הארוכה של פתרונות מסוננים-רקורסיביים-grep על GitHub, כולם מבוססים על הרעיון כי הבעיה עם המקורי של אנדי לסטר פרל מימוש חשבוןאם זה נכתב ב פרל. . הבעיה האמיתית היחידה מבחינת הביצועים היא פרל נכתב על ידי אנדי, שלא נראה שיש לו שום כישרון למושגים של ביצועי מערכות (כמו חקלאות). חיפוש עבודה במקביל לבנייה ייעודית ג' בִּינָרִי), אבל במקום זאת מכוון לניידות עצלה על ידי ניסיון ללכוד את כל הקוד כטהור בעל הליך משנה יחיד. פרל

מי ייתן ואלף פרחים יפרחו, לא משנה מה הם נראים!

קישור קבוע 

 

   

הערות  


קבצים מצורפים  

קישורים  


אינדקס


יחסי תלות בשפה האנגלית

  • מה זה Smart Content Dependency Management™?— הבנה ברורה של גרף התלות של אתר האינטרנט שלך תבטיח שתוכל למקסם את הביצועים של טכנולוגיית הבנייה שלנו בקנה מידה ... יום א׳, 28 אפר׳ 2024

 

  • גית וללא דחיה— יש הבחנה ברורה בין ההיסטוריה "מחויבות" לבין ההיסטוריה "העלאה" ... יום א׳, 28 אפר׳ 2024

 

  • רשימות דיוור— כתובות זמניות אלה הן anathema ל `ezmlm-idx`'s מנוי ומערכות מתינות ... שבת, 27 אפר׳ 2024

 

  • מדריך אבטחת מידע— יש להתייחס לכל הנתונים שמקורם ב-UNIX בזמן ריצה **קריאת מערכת** כ-**tainted** ... שבת, 27 אפר׳ 2024

שנת הדרקון



COVID-19 במרץ 2020

  • צמיחה מעריכית ו-COVID-19— קח את הזמן שלך עם **המתמטיקה** סעיף — חשוב להיות צרכן משכיל של סטטיסטיקה הרלוונטית למגפה הנוכחית ... יום ב׳, 30 ינו׳ 2023

 

  • על בעיית הספאם...— התוסף היחיד הטוב ביותר עבור `Qpsmtpd`למרות שקשה להבין מדוע ... יום א׳, 29 ינו׳ 2023

 


היפרבולית Honeycomb


 

  • תנועת DevOps— הרעיון הגדול מאחורי "התנועה" הוא לא רק לתת למפתחים יותר חבל ... יום ו׳, 15 דצמ׳ 2023

 

  • כיף עם htop— תכונות htop מתקדמות בפלטפורמות יוניקס פופולריות ... יום ה׳, 19 ינו׳ 2023

ארכיטקטורת מידע

  • ארכיטקטורת מידע— כל סולם הטכנולוגיות הרלוונטי לעיצוב, להצגה, ליחסים ולאילוצים ארכיטקטוניים המכסים כל כתובת URL שבה אתה משרת ... יום ב׳, 11 מרץ 2024

זפת ונוצות

  • Apache HTTPd Devs נחשב מזיק— פיליפ לא ידע כל כך טוב אז היה עד כמה [מציצה, vapid, וטריטוריאלית](https://www.mail-archive.com/dev@httpd.apache.org/msg77781.html) הקבוצה הזו הפכה ... יום ו׳, 26 אפר׳ 2024

 

  • השמחה של DTrace— למדוד פעמיים, לחתוך פעם אחת, לפני תחילת מאמץ אופטימיזציה קוד ... יום ו׳, 26 אפר׳ 2024