c shift מהירות
-
כתבתי את הקוד הזה
#include <stdio.h> #include <time.h> #include <string.h> int main(void) { unsigned int a1 = 0xf3040506; unsigned int *a = ( unsigned int *)&a1; unsigned char *m = (unsigned char* )&a1; unsigned long forcount = 5000000000 ,i; unsigned char r , g , b , al; printf("%x\n", *a); printf("r i %x\n", m[0]); printf("g i %x\n", m[1]); printf("b i %x\n", m[2]); printf("a i %x\n", m[3]); printf("r p %x\n", (unsigned char) *a ); printf("g p %x\n", (unsigned char) (*a >> 8)); printf("b p %x\n", (unsigned char) (*a >> 16) ); printf("a p %x\n", (unsigned char) (*a >> 24) ); clock_t t; t = clock(); for(i = 0;i < forcount ;i++) { r = m[0]; g = m[1]; b = m[2]; al = m[3]; } t = clock() - t ; printf ("pointer take (%f seconds).\n",((float)t)/CLOCKS_PER_SEC); t = clock(); for(i = 0;i < forcount ;i++) { r = (unsigned char) *a; g = (unsigned char) (*a >> 8); b = (unsigned char) (*a >> 16); al = (unsigned char) (*a >> 24); } t = clock() - t ; printf ("shift take (%f seconds).\n",((float)t)/CLOCKS_PER_SEC); return 0; }
אצלי במחשב זה התוצאה של הקוד
r i 6 g i 5 b i 4 a i f3 r p 6 g p 5 b p 4 a p f3 pointer take (18.330000 seconds). shift take (18.320000 seconds).
מה שאני לא מבין למה בshift עובד קצת יותר מהר
הרי זה פעולה חשבונית יותר מאשר משיכה של איבר ממערך.פורסם במקור בפורום CODE613 ב26/09/2013 22:17 (+03:00)
-
הרצתי את זה בקומפיילר אחר
C99 strict
זה מראה תוצאה הפוכה הshift יותר איטי.
f3040506 r i 6 g i 5 b i 4 a i f3 r p 6 g p 5 b p 4 a p f3 pointer take (1.770000 seconds). shift take (2.010000 seconds).
פורסם במקור בפורום CODE613 ב26/09/2013 22:42 (+03:00)
-
-
גם מאוד לא נראה לי שהאתרים האלו של הרצת קוד אופליין מקפלים ממש לקובץ ומריצים.
מסתבר שהם בנו קומפיילרים ייעודיים לכל שפה שמפרשים בזמן אמת ובעצם רק מהווים סימולציה לתוצאה.
כל האופטימזציות וכו' של קומפיילר רגיל לבטח לא מופעלות, כי לא זה הרעיון, רק לראות את התוצאה ולא את דרך פעולתה. ממילא המימוש של גישה למשתנה/איבר ממערך ממש לא מתורגמת לגישה לכתובת בזיכרון בשרת.פורסם במקור בפורום CODE613 ב29/09/2013 13:11 (+03:00)
-
הקומפיילר הראשון לא מראה זמן בכלל. כאילו פונקציות clock לא עובדת.
אבל אני ניסתי את זה במחשב שלי.עשיתי עוד בדיקה והפכתי את הסדר וזה הביא תוצאה הפוכה כלומר השינוי לדעתי בניהם זה בגלל שלוקח קצת זמן למעבד עד שהוא מגיע למהירות גבוהה.
כלומר בתחילה המעבד עובד על תדר נמוך ובגלל שזה נדרש אז הוא מאיץ מה שגורם לבדיקה הראשונה להיות יותר איטית.
לי נראה שאין הפרש בניהם כי כל פעולה נמדדת ב32 ביט.
כלומר אין הבדל בין העתקה של ארבעה בתים להעתקה של בית אחד כי שניהם זה מחזור עיבוד אחד.
לכן גם הshift לא משנה כלום כי זה מחזור עיבוד אחד.צריך לבדוק את זה על מעבד 8 ביט
כנראה שם יהיה הבדל משמעותי.פורסם במקור בפורום CODE613 ב29/09/2013 14:29 (+03:00)
-
@דוד ל.ט.
גם מאוד לא נראה לי שהאתרים האלו של הרצת קוד אופליין מקפלים ממש לקובץ ומריצים.
מסתבר שהם בנו קומפיילרים ייעודיים לכל שפה שמפרשים בזמן אמת ובעצם רק מהווים סימולציה לתוצאה.
כל האופטימזציות וכו' של קומפיילר רגיל לבטח לא מופעלות, כי לא זה הרעיון, רק לראות את התוצאה ולא את דרך פעולתה. ממילא המימוש של גישה למשתנה/איבר ממערך ממש לא מתורגמת לגישה לכתובת בזיכרון בשרת.לדעתי הם מקפלים ממש הם גם כותבים דרך מה הם מקמפלים.
gcc4 שזה קומפילר ידוע או mono ל C#.
פורסם במקור בפורום CODE613 ב29/09/2013 18:53 (+03:00)