שְׁאֵלָה:
פונקציות תזמון ב- R.
Tim
2010-10-01 16:46:10 UTC
view on stackexchange narkive permalink
  1. ברצוני למדוד את הזמן שלוקח לחזור על הפעלת פונקציה. האם משוכפל () ומשתמשים בקבוצות לולאות? לדוגמא:

      system.time (replicate (1000, f ())); system.time (for (i in: 1: 1000) {f ()});  

    שיטה מועדפת.

  2. בפלט של system.time () , הוא sys + משתמש זמן המעבד בפועל להפעלת התוכנית? האם חלף מדד טוב לביצועי הזמן של התוכנית?

רק לפרוטוקול, מכיוון שאני ברור שמאוחר מדי לשנות את מהלך השאלה הזו: זה סוג הנושא שלדעתי הוא המתאים ביותר ל- StackOverflow.
@Matt אני מסכים ששאלות לגבי כמה פעמים תוכנית מתאימה היטב ל- SO.אני גם מסכים שפרשנות מילולית לשאלה זו (כפי שנלקח על ידי כמה מהתשובות) תביא אותה לעליית נושא כאן בקורות החיים.נראה שיש עניין סטטיסטי כלשהו ב * תכנון * ניסוי תזמון וב * ניתוח * התוצאות של ניסוי כזה.
חָמֵשׁ תשובות:
#1
+25
Dirk Eddelbuettel
2010-10-01 17:03:12 UTC
view on stackexchange narkive permalink

לגבי שתי הנקודות שלך:

  1. זה סגנוני. אני אוהב את replicate () כיוון שהוא פונקציונלי.
  2. אני נוטה להתמקד ב- שחלף , כלומר המספר השלישי.
  3. ol >

    מה שאני עושה לעתים קרובות זה

      N <- someNumbermean (משכפל (N, system.time (f (...)) [3], גזוז = 0.05))  קוד> 

    כדי לקבל ממוצע גזום של 90% מה- N חזרות על שיחה f().

    (נערך, בתודה להדלי על כך שתפס thinko.)

האם אתה לא מתכוון ל- `מתכוון (לשכפל (N, system.time (f (...)) [3]), לקצץ = 0.05)`?
אם שיחת f () ארוכה אז זה בסדר. עם זאת, אם שיחת f () קצרה, סביר להניח שכל תקורה של שיחת תזמון תגדיל את מדידת השגיאות. עם שיחה אחת ל- system.time () על פני חזרות רבות של f () אפשר לחלק את השגיאה את השיחה עד שהיא בערך אינסופי מינימלי (והיא חוזרת מהר יותר).
@John: תודה אבל אני לא ממש מבין את מה שאמרת. אני עדיין תוהה מה עדיף, וחוזר על f () בתוך מערכת system.time או מחוצה לה ()?
לכל קריאה לפקודת system.time () יש זמן משתנה כלשהו שנדרש לשיחה הגורמת לכמות כלשהי של שגיאת מדידה. זו כמות קטנה. אבל מה אם f () היא שיחה קצרה מאוד? אז ניתן לשלב שגיאה זו עם הזמן שלוקח להתקשר f (). לכן, כשאתה מתקשר f () 1e5 פעמים בתוך שיחת מערכת אחת. Time () השגיאה מתחלקת לחתיכות 1e5. כשאתה מתקשר ל- system.time () לכל f () ההשפעה שלה עשויה להיות משמעותית אם הזמן f () קטן. כמובן, אם כל מה שאתה צריך זה תזמון יחסי זה לא משנה כל כך.
אה, והחלק השני הוא שזה יהיה מהיר יותר להתקשר רק פעם אחת ל- system.call ().
#2
+19
whuber
2010-10-01 22:08:15 UTC
view on stackexchange narkive permalink

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

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

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

#3
+10
user88
2010-10-01 18:30:55 UTC
view on stackexchange narkive permalink

ניתן גם לזמן עם צעדים שהוחזרו על ידי Sys.time ; זה כמובן מודד זמן קיר, ולכן זמן חישוב בזמן אמת. קוד לדוגמא:

  Sys.time () - >start; replicate (N, doMeasuredComputation ()); print (Sys.time () - start);  
#4
+3
Tal Galili
2010-10-02 01:51:11 UTC
view on stackexchange narkive permalink

לגבי איזה מדד תזמון להשתמש, אני לא יכול להוסיף למגיבים האחרים.

לגבי הפונקציה שיש להשתמש בה, אני אוהב להשתמש ב benchmark? מחבילה rbenchmark.

#5
+1
John
2010-10-01 20:48:31 UTC
view on stackexchange narkive permalink

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

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

טיפ טיפ: פרסם את החלק השני כהערה לתשובתו של דירק.


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 2.0 עליו הוא מופץ.
Loading...