22-03-2009, 14:22
|
מנהל
|
|
חבר מתאריך: 26.07.08
הודעות: 6,473
|
|
benchmark - קריאה למתודה - בשיטה הסטטית או דרך instance
יצא לי לקרוא במערכת קוד פתוח מסוימת שקריאה לפונקציה בצורה הסטטית (עם נקודותיים, "::" ) זה יותר מהיר. מבחינה הגיונית יש משהו בזה.
עשיתי בדיקה עם 2 מחלקות שבכל אחת מהן יש 10 משתני מחלקה, ו-60 מתודות.
במחלקה הראשונה ( "bar" ) לא הגדרתי את המתודות בתור סטטיות (הוספת static).
במחלקה השנייה ( "bar_static" ), כן הגדרתי את המתודות בתור סטטיות.
את בדיקות הזמן של ה-instance עשיתי פעם אחת עם לכלול את ה- new class_name ופעם אחת בלי. (כיוון שפעם אחת זה בשביל לדמות טעינת עמוד מלאה שכוללת new, ופעם אחרת בשביל לבדוק את זמן הריצה של הקריאות למתודות בלבד, ללא ה-new).
התוצאות, לאחר חישוב ממוצע מדויק:
קוד:
WITHOUT declaring methods as static
-------------------------------------
instance with "new": 0.0001223882039388
instance without "new": 0.00010524193445842
statically: 0.00026756525039673
With declaring methods as static
-------------------------------------
instance with "new": 0.00011253356933594
instance without "new": 9.6420447031657E-5
statically: 0.00014597177505493
ביצעתי 12 בדיקות יחידות (ללא לולאת for שמריצה את אותו בלוק של קוד פעמים רבות) כאשר ה-CPU מיוצב על 99% פנוי. למעלה מוצג רק הממוצע הסופי של הבדיקות.
בכל סוג של בדיקה, עשיתי את חלקי הקוד האחרים בתור הערה (php note) כדי שבוודאות לא יפריעו לתוצאה.
ניתן לראות שב-2 המצבים, גם כאשר המתודה מוגדרת בתור static וגם כאשר לא - עדיין השיטה של ה-instance מהירה יותר.
אני חושב שכיוון שקריאה סטטית למתודה שאינה מוגדרת כ-static, גורם להערת E_STRICT, זה מאיט את זמן הריצה. הנושא הזה בא לידי ביטוי גם ב-benchmark אחר שעשיתי עם include/require שזרקו במקרים מסוימים הערת E_NOTICE. (מסקנה: עדיף לתכנת לפי החוקים המחמירים\strict ביותר. בכל מקרה זה לא יכול לפגוע)
הדבר שמפתיע יותר הוא שכאשר מגדירים את המתודה כ-static, זה משפר את זמן הריצה, לא משנה באיזו שיטה קוראים למתודה.
דבר נוסף שהפתיע, זה שהזמן ריצה של המבחנים הנ"ל משתפר כאשר אני מוריד את הערת ה-php מכל המבחנים, שזה בניגוד לצורה שבה ביצעתי את הבדיקות. (אולי php מבצע אופטימיזציה כאשר נתקל בקטעי קוד המבצעים דברים דומים?)
הקובץ עם הקוד:
new_or_not.php
הקובץ עם כל התוצאות של הבדיקות:
new_or_not_results.txt
|