【发布时间】:2013-11-21 08:03:22
【问题描述】:
这是Linux/GUN下的C程序:
#include<stdio.h>
#include<sys/time.h>
#define Max 1024*1024
int main()
{
struct timeval start,end;
long int dis;
int i;
int m=0;
int a[Max];
gettimeofday(&start,NULL);
for(i=0;i<Max;i += 1){
a[Max] *= 3;
}
gettimeofday(&end,NULL);
dis = end.tv_usec - start.tv_usec;
printf("time1: %ld\n",dis);
gettimeofday(&start,NULL);
for(i=0;i<Max;i += 16){
a[Max] *= 3;
}
gettimeofday(&end,NULL);
dis = end.tv_usec - start.tv_usec;
printf("time2: %ld\n",dis);
return 0;
}
输出:
时间1:7074
时间2:234
距离很远
这个 Java 程序:
public class Cache1 {
public static void main(String[] args){
int a[] = new int[1024*1024*64];
long time1 = System.currentTimeMillis();
for(int i=0;i<a.length;i++){
a[i] *= 3;
}
long time2 = System.currentTimeMillis();
System.out.println(time2 - time1);
time1 = System.currentTimeMillis();
for(int i=0;i<a.length;i += 16){
a[i] *= 3;
}
time2 = System.currentTimeMillis();
System.out.println(time2 - time1);
}
}
输出:
92
82
几乎一样
与 CPU 缓存。为什么他们有这么大的区别? Cpu Cache在C编程中无效?
【问题讨论】:
-
要查找执行时间,请使用 System.nanoTime() 而不是 System.currentTimeMillis()
-
在您的
C代码中,语句a[Max] *= 3将修改数组末尾之后的内存。你的意思是a[i]? -
是的,这是一个错误,a[i] 是正确的。