השוואה בין סוגי הכנסה למערך

בקטגוריה: טיפים והערות|יעילות|שפות תכנות

16 ספט' 2010

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

  • $arr[$i] = $val; – הכנסת הערך $val למערך $arr במקום ה$i.
  • $arr[] = $val; – הכנסת הערך $val למערך $arr במקום הבא (לדוגמה אם יש אינדקסים 0, 1, 2 המקום יהיה 3).
  • array_push($arr, $val); – זהה לחלוטין לקודם מבחינת תפקוד.
  • נבחן שיטה אחת נוספת שממלאת מערך במספרים מa עד b נכתב כך: $arr = range($a, $b);

המבחן

בניתי מבחן קטן, שמכניס את המספרים מ0 עד 99,999 לתאים המתאימים (0 ב0, 1 ב1 וכו') – סה"כ 100,000 תאים.
המבחן בנוי מהצהרה על המערך ולולאה שמכניסה את $i למקום ה$i בהתאם לשיטות 1 עד 3 (הניחו כי $val הוא $i).

define('TIME', microtime(true));
 
$arr = array();
 
for($i = 0; $i < 100000; $i++) {
	// HERE COMES THE ACTION
}
 
echo microtime(true) - TIME;

נוסף לכך הרצתי במקום הלולאה את הקוד הבא:

$arr = range(0, 99999);

התוצאות נראו כך (פחות שניות יותר טוב):

  • $arr[$i] = $i;
    0.046030044555664 (שניות)
  • $arr[] = $i;
    0.048002958297729 (שניות)
  • array_push($arr, $val);
    0.17743587493896 (שניות)
  • $arr = range(0, 100000);
    0.020608901977539(שניות)

או בגרף (כמה שנמוך יותר, יותר מהיר):

לכן הסקתי את המסקנות הבאות:

  • במידה ואתם צריכים מערך שמכיל מספרים מa עד b תשתמשו בפונקציה range.
  • עדיף במעט להשתמש באינדקסים (זניח).
  • לא להשתמש בarray_push היא איטית ביותר מפי 3.5!

2 תגובות להשוואה בין סוגי הכנסה למערך

סמלון

איתי סלע

18 ספטמבר, 2010 בשעה 17:00

אדיר!
הפוסטים שלך בנושא יעילות מאוד מעניניים וכן מאוד חשובים!

לכל בעיה יש מספר רק של פיתרונות אפשריים ואני באופן אישי מבזבז זמן רב בהתחבטויות
באיזה פיתרון עליי לבחור (ולעיתים יעילות אינה בראש מעיני – יש שיקולים נוספים כמו זמן פיתוח, עלות, גמישות עתידית וכו').

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

ממליץ להוסיף קטגורית "יעילות" בבלוג ואני כמובן אשמח לקרוא כל פוסט שיתפרסם שם :)

סמלון

Shay | Exalted Web

18 ספטמבר, 2010 בשעה 19:47

ממש כיף לשמוע תגובה כזו ממך, קיבלתי את עצתך בנושא הקטגוריה.
תודה D:

טופס התגובה

קצת עלי

שמי שי ואני בונה אתרים וכיום חותך (מקודד) ומתכנת.
אני עובד אל מול התקן העולמי של W3C, ומתכנת בשפת PHP תוך שימוש בטכנולוגיות עדכניות, תוך שמירה על קוד שניתן לתחזוקה.
בין כישורי נמנים: PHP, SQL, (X)HTML, CSS (2-3), XML, JavaScript ( + jQuery) ועוד.

Zend Certified Engineer

  • דניאל: אחלה של מאמר. [...]
  • Shay | Exalted Web: אין סיבה שיהיו תווים מוזרים. פשוט שמור הכל בutf8, כולל את הdatabase, הhtml והphp, ואל תשכח להריץ שאי [...]
  • יונתן: אין לך בעיה עם תווים בעברית מהמסד? כל מה שאני שולף מוצג לי בתווים מוזרים.. [...]
  • Shay | Exalted Web: שמחתי לעזור :) [...]
  • יהונתן|YtsWeb: שי,תודה רבה על המאמר. חיפשתי באמת איך לחלק את העמודים בצורה טובה ושלא יראו 1000 מספרים. [...]

פרוייקט תכנות מונחה עצמים

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

קצת מידע

אחלק לפניכם את האתר לשלושה נושאים:

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