ביצועים#
כיצד לגרום ל־Perl לרוץ במהירות על pperl, ו - חשוב לא פחות - כיצד לדעת אם זה כבר קורה. מדריך זה הוא השכבה המעשית: היכן עצת הביצועים הקלאסית של Perl עדיין תקפה, היכן ה־JIT והמקבילן האוטומטי של pperl הפכו אותה בשקט ללא־רלוונטית, והיכן pperl מתגמל קוד המעוצב בדרכים ש־Perl מהמעלה־הזרם מעולם לא התעניין בהן.
במכוון זה אינו סיור במנגנונים. ל־JIT, למתזמן המקבילי, לדיספאץ« של המודולים הנייטיביים ול־FFI יש לכל אחד פרק משלו במדריך הארכיטקטורה; מדריך זה אומר לכם מה לכתוב כדי שהם יופעלו, ומפנה לאותם פרקים עבור המדוע.
למי זה מיועד#
מתכנת Perl עובד עם תוכנית איטית מדי, או כזו שברצונו לשמור מהירה. אתם יודעים לכתוב את הקוד; אתם רוצים לדעת אילו הרגלים משתלמים כאן, אילו הם כעת משקל מת, וכיצד למדוד את ההבדל בלי לנחש.
אינכם צריכים להבין את Cranelift, את Rayon, או את הלולאה הפנימית של המפרש. היכן שהתנהגות תלויה בהם, מדריך זה מציין את ההתנהגות ומקשר לפרק שמסביר אותה.
הכלל היחיד ששורד הכול#
מדדו תחילה. כל כלל אחר במדריך זה מותנה במדידה שעדיין לא ביצעתם. האינטואיציה לביצועי Perl, שחודדה על המפרש מהמעלה־הזרם, חוזה שגוי על pperl בשני הכיוונים: קוד שאתם מצפים שיהיה איטי מהודר לעיתים לקוד מכונה נייטיבי ורץ מהר מ־C; קוד שאתם מצפים שה־JIT יחלץ נופל לעיתים בחזרה אל המפרש משום שפעולת מחרוזת אחת חדרה לתוך לולאה מספרית.
ה־profiler אינו משקר, ואילו האינטואיציה שלכם, שהועברה מסביבת ריצה אחרת, כן. התחילו במדידה.
כיצד מאורגן המדריך#
מדידה - הכלים שאכן עובדים תחת pperl. ה־profilers מבוססי XS מהמעלה־הזרם (
Devel::NYTProf) אינם נטענים; הבנייה המובנית--features=profileוהמריץbench/run-perlbenchכן. כיצד לקרוא את הפלט שלהם וכיצד לבצע השוואת A/B בין שתי גרסאות של שגרה.ניבים - מיון של ניבי הביצועים הקלאסיים של Perl. כל אחד מתויג: עדיין תקף, התרוקן מתוכן בידי ה־JIT או המקבילן, או רלוונטי מחדש בשל אופן ההידור של pperl. הניבים שהיו פולקלור ב־Perl מהמעלה־הזרם אינם כולם פולקלור כאן.
מיון -
sortלעומק: טרנספורם שוורץ, טרנספורם גוטמן-רוסלר, עלות תת־השגרה שלsort, ומתי משווה הוא צוואר הבקבוק.כתיבת pperl מהיר - התוכנית החיובית: כיצד לבנות לולאה חמה כך שה־JIT יהדר אותה, כיצד לעצב רדוקציה כך שהמקבילן יתבע אותה, והטעות האחת - ערבוב עבודת מחרוזות לתוך לולאה מספרית - שמשביתה את שניהם בשקט.
מה מדריך זה אינו מכסה#
המנגנונים שוכנים במקום אחר ומדריך זה אינו חוזר עליהם:
הידור JIT - מה מהודר, מודל המטמון, ניתוח טיפוסי המשתנים.
ביצוע מקבילי - ניתוח הרדוקציה, שער תופעות הלוואי, בקרות ה־thread של ה־CLI.
ביצועי ביטויים רגולריים - חזרה לאחור, תבניות קטסטרופליות, ה־optimiser של המנוע. מהירות ביטויים רגולריים היא תחום בפני עצמו; דבר במדריך זה אינו משכפל אותו.
מודולים נייטיביים - מדוע
List::Utilוחבריו רצים במהירות מובנית ללא שכבת XS.Auto-FFI - קריאה ל־C ללא XS, ועלות הניתוב (marshalling) לכל קריאה שהופכת אותו לכלי הלא־נכון ללולאה פנימית חמה.
הערה על מספרים#
שיפורי המהירות הקונקרטיים במדריך זה משוכפלים מפרקי הארכיטקטורה והמקביליות, הנושאים את הנתונים הנמדדים ואת מדד הביצועים שהפיק אותם. היכן שמדריך זה מציין שיפור מהירות ללא מספר, ההתנהגות האיכותית מבוססת אך הנתון המדויק תלוי במכונה שלכם, בנתונים שלכם ובבנייה שלכם - הריצו bench/run-perlbench ובטחו במדידה שלכם על פני כל יחס מודפס.