דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. c shift מהירות

c shift מהירות

מתוזמן נעוץ נעול הועבר ארכיון code613m
9 פוסטים 3 כותבים 608 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • M מנותק
    M מנותק
    magicode
    כתב ב נערך לאחרונה על ידי
    #1

    כתבתי את הקוד הזה

    http://ideone.com/9CKBvS

    #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)

    תגובה 1 תגובה אחרונה
    0
    • M מנותק
      M מנותק
      magicode
      כתב ב נערך לאחרונה על ידי
      #2

      הרצתי את זה בקומפיילר אחר

      C99 strict

      http://ideone.com/97W4lC

      זה מראה תוצאה הפוכה ה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)

      תגובה 1 תגובה אחרונה
      0
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #3

        אצלי אלו התוצאות:

        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 (3.806000 seconds).
        shift take (3.712000 seconds).
        

        פורסם במקור בפורום CODE613 ב26/09/2013 23:09 (+03:00)

        תגובה 1 תגובה אחרונה
        0
        • M מנותק
          M מנותק
          magicode
          כתב ב נערך לאחרונה על ידי
          #4

          @רחמים

          אצלי אלו התוצאות:

          איפה במחשב שלך בוינדוס msvc קומפיילר ?

          פורסם במקור בפורום CODE613 ב26/09/2013 23:24 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • רחמיםר מנותק
            רחמיםר מנותק
            רחמים מורחק
            כתב ב נערך לאחרונה על ידי
            #5

            וינדוס 7, קימפלתי בויז'ואל סטודיו 2010.

            פורסם במקור בפורום CODE613 ב26/09/2013 23:43 (+03:00)

            תגובה 1 תגובה אחרונה
            0
            • dovidD מנותק
              dovidD מנותק
              dovid ניהול
              כתב ב נערך לאחרונה על ידי
              #6

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

              פורסם במקור בפורום CODE613 ב29/09/2013 11:17 (+03:00)

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #7

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

                פורסם במקור בפורום CODE613 ב29/09/2013 13:11 (+03:00)

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                0
                • M מנותק
                  M מנותק
                  magicode
                  כתב ב נערך לאחרונה על ידי
                  #8

                  הקומפיילר הראשון לא מראה זמן בכלל. כאילו פונקציות clock לא עובדת.
                  אבל אני ניסתי את זה במחשב שלי.

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

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

                  לי נראה שאין הפרש בניהם כי כל פעולה נמדדת ב32 ביט.

                  כלומר אין הבדל בין העתקה של ארבעה בתים להעתקה של בית אחד כי שניהם זה מחזור עיבוד אחד.
                  לכן גם הshift לא משנה כלום כי זה מחזור עיבוד אחד.

                  צריך לבדוק את זה על מעבד 8 ביט
                  כנראה שם יהיה הבדל משמעותי.

                  פורסם במקור בפורום CODE613 ב29/09/2013 14:29 (+03:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • M מנותק
                    M מנותק
                    magicode
                    כתב ב נערך לאחרונה על ידי
                    #9

                    @דוד ל.ט.

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

                    לדעתי הם מקפלים ממש הם גם כותבים דרך מה הם מקמפלים.

                    gcc4 שזה קומפילר ידוע או mono ל C#.

                    פורסם במקור בפורום CODE613 ב29/09/2013 18:53 (+03:00)

                    תגובה 1 תגובה אחרונה
                    0

                    בא תתחבר לדף היומי!
                    • התחברות

                    • אין לך חשבון עדיין? הרשמה

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