0

ブロック while(k--){} の後の私のコードで、 (t1-t0)=0 の理由を誰が知ることができますか?
他のマシンで同じコードを試して、同じ問題が発生するかどうかを確認できるのは誰ですか?
私のマシンは、
CPU を搭載した HP ノートブックです: intel P9300 2.26GHz x 2、4GB
メモリ、
OS: ubuntu 12.04、
Linux カーネル: 3.2.0-45-generic。
このスクリプトは gwan の main.c です。

typedef struct 
{ 
   u64 a[10000000], b[10000000], c[10000000];

} data_t;

char str[512];
u64 size;



int main(int argc, char *argv[])
{

   data_t **data = (data_t**)get_env(argv, US_SERVER_DATA);
                                        // US_VHOST_DATA);

   if(!*data) // first time: persistent pointer is uninitialized
   {
      *data = (data_t*)calloc(1, sizeof(data_t));
      if(!*data) return 500; // out of memory
      size = sizeof(data_t);
      s_snprintf(str, sizeof(str)-1,   "initialized data: %llu Bytes", size);
      puts(str);
   }


   u64 t0, t1, timea, timeb, timediff, va, vb, vc, wa, wb, wc;
   u64 m, j, n, k;

   for(;;)
   //int i=10; while(i--)
   {
      sleep(1);
      //t1=0;time=0;
      m=10000000; j=m;
      t0 = getms();
      while(j--){
         va = __sync_add_and_fetch(&(*data)->a[1], 1);
         vb = __sync_add_and_fetch(&(*data)->b[2], 2);
         vc = __sync_add_and_fetch(&(*data)->c[3], 3);
      }
      t1 = getms();
      timediff = t1-t0;
      timea = timediff ? (3*m)/(t1-t0) : m;
       // problem code below:
      n=m; k=n;
      t0 = getns();
      while(k--){
         wa++;
         wa--;
         wa++;
         wa--;
      }
      t1 = getns();
      timediff = t1-t0;
      timeb = timediff ? (4*n)/(t1-t0) : n;

      //s_snprintf(str, sizeof(str) - 1, "data[0]->a[1]:%llu, data[0]->b[2]:%llu, data[0]->c[3]:%llu, atomic add:%llu/ms, val++:%llu/ms", 
                                        //data[0]->a[1],      data[0]->b[2],      data[0]->c[3],      timea,   timeb );
                                        //va,      vb,      vc,      timea,   timeb );
      s_snprintf(str, sizeof(str) - 1, "atomic add:%llu/ms, ++val:%llu/ns, end value:%llu", 
                                                   timea,         timeb,         wa );
      puts(str);
   }
   return 0;

ログファイルは次のとおりです。

initialized data: 240000000 Bytes
[Wed Jun 05 04:57:17 2013 GMT] memory footprint: 5.28 MiB.
atomic add:35377/ms, ++val:19531/ns, end value:0
atomic add:30674/ms, ++val:39062/ns, end value:0
atomic add:86206/ms, ++val:10000000/ns, end value:0
atomic add:86455/ms, ++val:10000000/ns, end value:0
atomic add:48309/ms, ++val:10000000/ns, end value:0
atomic add:30706/ms, ++val:10000000/ns, end value:0
atomic add:30674/ms, ++val:10000000/ns, end value:0
atomic add:30674/ms, ++val:10000000/ns, end value:0
atomic add:86705/ms, ++val:10000000/ns, end value:0
atomic add:86455/ms, ++val:10000000/ns, end value:0
atomic add:86455/ms, ++val:10000000/ns, end value:0
atomic add:61099/ms, ++val:10000000/ns, end value:0
atomic add:50167/ms, ++val:10000000/ns, end value:0
...

最初の 2 つの結果だけが、ナノ秒単位で意味のあるデータを示しています。残りはすべて ++val:10000000/ns、つまり t1-t0 = 0
です。getus() と同じ問題です。
getms() を使用すると、t1-t0 は常に 0 になり
ます。注: 2 行目は最初の行の 2 倍です。つまり、19531/ns x 2 = 39062/ns です。

4

2 に答える 2

0

なぜ (t1-t0)=0 なのですか?

このコードは特に読みやすいものではありません。

(差ではなく) 時間の値を出力することから始めてみませんか? 次に、差がゼロである理由を確認します。

時間分解能が低すぎる (連続する値が等しい) か、API 呼び出しが失敗している (0 を返す) 可能性があります。

httpdate.c G-WAN の例はあなたのマシンで動作していますか?

于 2013-06-05T10:16:33.823 に答える