谁能告诉我,在我的代码块 while(k--){} 之后,为什么 (t1-t0)=0 ?
谁能帮忙在别的机器上试试同样的代码,看看是不是同样的问题?
我的机器是惠普笔记本,
CPU:intel P9300 2.26GHz x 2,4GB
内存,
操作系统: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
...
只有前两个结果以纳秒为单位显示有意义的数据。其余的都是 ++val:10000000/ns,即 t1-t0 =
0。getus() 也有同样的问题。
当我使用 getms() 时,t1-t0 总是等于 0。
注意:第二行是第一行的两倍,即 19531/ns x 2 = 39062/ns。