לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 11-06-2009, 11:45
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
benchmark + תכונות PHP - שיטות לסינון\זיהוי ערך מתוך רשימה מוכרת

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

את ה-benchmark עשיתי מול 4 שיטות:
  1. מערך שהערכים שאנו מחפשים נמצאים במפתח של האיבר.
  2. מערך שהערכים שאנו מחפשים נמצאים בערך של האיבר.
  3. מבנה בקרה switch.
  4. מחרוזת של רשימת CSV.

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

בכל אחת מהשיטות הנ"ל עשיתי 3 בדיקות שונות:
כאשר הערך שאני רוצה למצוא: אינו קיים ברשימה, קיים בראש\תחילת הרשימה, קיים בסוף הרשימה.

הבדיקות האלו חיפשו את הערך בתוך הרשימה\ות פעם אחת בלבד.

תוצאות הבדיקות הסופיות:
קוד:
Array->key (no value) 7.1346759796142E-5 Array->key (value@beginning) 7.2449445724487E-5 Array->key (value@end) 7.4923038482666E-5 Array->value (no value) 7.5995922088623E-5 Array->value (value@beginning) 7.3432922363281E-5 Array->value (value@end) 7.6740980148316E-5 Switch...case (no value) 3.7610530853272E-5 Switch...case (value@beginning) 2.6077032089233E-5 Switch...case (value@end) 3.5613775253296E-5 CSV (no value) 3.1948089599609E-5 CSV (value@beginning) 2.8491020202637E-5 CSV (value@end) 3.284215927124E-5


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

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

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

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


במהלך שכתבתי את הנ"ל, לא רציתי לזרוק דברים באוויר, ולכן עשיתי עוד הפעם בדיקות - אף הפעם עשיתי חיפוש של ערכים רבים (ולא ערך אחד כמו מקודם) בתוך רשימת הערכים.
11 ערכים, מתוך 22 הערכים שחיפשתי, אינם קיימים ברשימה.

התוצאות מאששות את מה שחשבתי:
קוד:
Array->key 9.1075897216797E-5 Array->value 0.00028510888417562 Switch...case 0.00027334690093994 CSV 0.00012723604838054


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

החיפוש של המפתחות במערך לקח הרבה פחות זמן. זאת בזכות טבלת ה-HASH ש-PHP יצר למפתחות.
החיפוש של הערכים במערך והחיפוש של switch כמעט שווים, והכי פחות יעילים.
החיפוש ברשימת CSV שוב הפתיע - מאוד קרוב לחיפוש במפתחות המערך.

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

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

חשוב לי לציין שבכל פעם שביצעתי את הבדיקה, בידדתי את הקוד הספציפי שאני בודק לתוך קובץ נפרד, במקום לסמן את שאר הקוד בתור הערת PHP. כמו כן השתדלתי שה-CPU יהיה פנוי ב-99%.

קבצי הבדיקה:
https://2009-uploaded.fresh.co.il/2...11/33433424.rar

נערך לאחרונה ע"י dorM בתאריך 11-06-2009 בשעה 11:49.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 23:12

הדף נוצר ב 0.04 שניות עם 11 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2025 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר