<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      原子變量的性能問題

      #include <stdio.h>
      #include <sys/time.h>
      
      int main()
      {
          volatile int m;
      
          struct timeval start;
          gettimeofday(&start, NULL);
          for (int i = 0; i < 1000000; i++) {
              m++;
          }
          struct timeval end;
          gettimeofday(&end, NULL);
      
          printf("add cost %lldus\n", (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec));
      
          int n;
          gettimeofday(&start, NULL);
          for (int i = 0; i < 1000000; i++) {
              __sync_fetch_and_add(&n, 1);
          }
          gettimeofday(&end, NULL);
          printf("atomic cost %lldus\n", (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec));
      
          return 0;
      }

      之所以用volatile修飾m是拒絕編譯器對m++做優化。

      使用O2編譯并查看性能:

      $gcc -O2 -std=c99 -o perf atomic_perf.c
      $./perf
      add cost 2638us
      atomic cost 8510us
      

        可見如果你的變量壓根不會被多線程訪問,并且對性能極度苛刻的話,還是不要用原子變量了吧。因為在有些平臺上“A full memory barrier is created when this function is invoked”。

       

      可以通過下面的方法看到m++和原子操作的匯編之間的區別:

      $gcc -O2 -std=c99 -g -c atomic_perf.c
      $objdump -Sl atomic_perf.o
      
      atomic_perf.o:     file format elf64-x86-64
      
      Disassembly of section .text:
      
      0000000000000000 <main>:
      main():
      /home/admin/jinxin/test/atomic_perf.c:5
      #include <stdio.h>
      #include <sys/time.h>
      
      int main()
      {
         0: 55                    push   %rbp
      /home/admin/jinxin/test/atomic_perf.c:9
          volatile int m;
      
          struct timeval start;
          gettimeofday(&start, NULL);
         1: 31 f6                 xor    %esi,%esi
      /home/admin/jinxin/test/atomic_perf.c:5
         3: 53                    push   %rbx
         4: 48 83 ec 38           sub    $0x38,%rsp
      /home/admin/jinxin/test/atomic_perf.c:9
         8: 48 8d 6c 24 10        lea    0x10(%rsp),%rbp
         d: 48 89 ef              mov    %rbp,%rdi
        10: e8 00 00 00 00        callq  15 <main+0x15>
        15: 31 d2                 xor    %edx,%edx
      /home/admin/jinxin/test/atomic_perf.c:11
          for (int i = 0; i < 1000000; i++) {
              m++;
        17: 8b 44 24 2c           mov    0x2c(%rsp),%eax
      /home/admin/jinxin/test/atomic_perf.c:10
        1b: 83 c2 01              add    $0x1,%edx
      /home/admin/jinxin/test/atomic_perf.c:11
        1e: 83 c0 01              add    $0x1,%eax
      /home/admin/jinxin/test/atomic_perf.c:10
        21: 81 fa 40 42 0f 00     cmp    $0xf4240,%edx
      /home/admin/jinxin/test/atomic_perf.c:11
        27: 89 44 24 2c           mov    %eax,0x2c(%rsp)
      /home/admin/jinxin/test/atomic_perf.c:10
        2b: 75 ea                 jne    17 <main+0x17>
      /home/admin/jinxin/test/atomic_perf.c:14
          }
          struct timeval end;
          gettimeofday(&end, NULL);
        2d: 31 f6                 xor    %esi,%esi
        2f: 48 89 e7              mov    %rsp,%rdi
        32: e8 00 00 00 00        callq  37 <main+0x37>
      /home/admin/jinxin/test/atomic_perf.c:16
      
          printf("add cost %lldus\n", (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec));
        37: 48 8b 04 24           mov    (%rsp),%rax
        3b: 48 2b 44 24 10        sub    0x10(%rsp),%rax
        40: bf 00 00 00 00        mov    $0x0,%edi
        45: 48 8b 74 24 08        mov    0x8(%rsp),%rsi
        4a: 48 2b 74 24 18        sub    0x18(%rsp),%rsi
        4f: 48 69 c0 40 42 0f 00  imul   $0xf4240,%rax,%rax
        56: 48 01 c6              add    %rax,%rsi
        59: 31 c0                 xor    %eax,%eax
        5b: e8 00 00 00 00        callq  60 <main+0x60>
      /home/admin/jinxin/test/atomic_perf.c:19
      
          int n;
          gettimeofday(&start, NULL);
        60: 31 f6                 xor    %esi,%esi
        62: 48 89 ef              mov    %rbp,%rdi
        65: e8 00 00 00 00        callq  6a <main+0x6a>
        6a: 48 8d 54 24 28        lea    0x28(%rsp),%rdx
        6f: 31 c0                 xor    %eax,%eax
      /home/admin/jinxin/test/atomic_perf.c:21
          for (int i = 0; i < 1000000; i++) {
              __sync_fetch_and_add(&n, 1);
        71: f0 83 02 01           lock addl $0x1,(%rdx)
      /home/admin/jinxin/test/atomic_perf.c:20
        75: 83 c0 01              add    $0x1,%eax
        78: 3d 40 42 0f 00        cmp    $0xf4240,%eax
        7d: 75 f2                 jne    71 <main+0x71>
      /home/admin/jinxin/test/atomic_perf.c:23
          }
          gettimeofday(&end, NULL);
        7f: 48 89 e7              mov    %rsp,%rdi
        82: 31 f6                 xor    %esi,%esi
        84: e8 00 00 00 00        callq  89 <main+0x89>
      /home/admin/jinxin/test/atomic_perf.c:24
          printf("atomic cost %lldus\n", (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec));
        89: 48 8b 04 24           mov    (%rsp),%rax
        8d: 48 2b 44 24 10        sub    0x10(%rsp),%rax
        92: bf 00 00 00 00        mov    $0x0,%edi
        97: 48 8b 74 24 08        mov    0x8(%rsp),%rsi
        9c: 48 2b 74 24 18        sub    0x18(%rsp),%rsi
        a1: 48 69 c0 40 42 0f 00  imul   $0xf4240,%rax,%rax
        a8: 48 01 c6              add    %rax,%rsi
        ab: 31 c0                 xor    %eax,%eax
        ad: e8 00 00 00 00        callq  b2 <main+0xb2>
      /home/admin/jinxin/test/atomic_perf.c:27
      
          return 0;
      }
        b2: 48 83 c4 38           add    $0x38,%rsp
        b6: 31 c0                 xor    %eax,%eax
        b8: 5b                    pop    %rbx
        b9: 5d                    pop    %rbp
        ba: c3                    retq???
      

        

      posted @ 2017-06-26 19:21  CobbLiu  閱讀(875)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲国产成人精品无码区蜜柚| 亚洲无人区码二码三码区| 国产美女久久久亚洲综合| 日韩av毛片福利国产福利| 嗯灬啊灬把腿张开灬动态图| 国产尤物AV尤物在线看| 国产高在线精品亚洲三区| 国产一区日韩二区欧美三区| 中文字幕精品亚洲字幕成| 97一期涩涩97片久久久久久久| 亚洲日韩久久综合中文字幕| 欧美亚洲一区二区三区在线| 国产高颜值极品嫩模视频| 国产精品麻豆va在线播放| 97中文字幕在线观看| 国产精品第一页中文字幕| 国产色视频一区二区三区qq号| 欧美人与动牲猛交A欧美精品| 会宁县| 国产精品亚洲一区二区z| 泰和县| 亚洲精品国产男人的天堂| 桐柏县| 国产午夜福利精品视频| 久久中文字幕一区二区| 午夜国产精品福利一二| 亚洲国产在一区二区三区| 少妇熟女久久综合网色欲| 国产精品污双胞胎在线观看| 日本久久99成人网站| 99精品人妻少妇一区| 精品亚洲国产成人av| 激情综合网激情五月激情| 日本一区三区高清视频| 久久综合国产色美利坚| 任我爽精品视频在线播放| 久久亚洲精品亚洲人av| a级黑人大硬长爽猛出猛进| 九九热视频免费在线播放| 欧美日韩精品一区二区三区高清视频 | 欧美白妞大战非洲大炮|