对编程一直有很多疑问,很多时候甚至不知道如何描述这些疑问,但我知道自己可以从哪里可以找到自己的疑问和答案,答案是计算机系统,但感情上总觉得太难,没信心。编程语言、操作系统和计算机系统结构是三门课,一直分开来学,操作系统和计算机系统两门课尚算有所交织,而编程语言的课程似乎总是和这两门课程没有重叠之处。但恰恰编程又是建立在那两门课程之上的,三门课若能同时交互地学习效果肯定不错。
仅就计算机系统中对程序局部性的考虑而做的内存和缓存之间的调度设计来看,写代码时也应该利用这一设计。下面是利用数组顺序存储的特点展现代码局部性对程序运行速度的影响:
良好的空间局部性代码:根据数组在内存空间的存储顺序依次取数。
#include <stdio.h>
#include <time.h>
int main()
{
long int arr[1000][1000]={1};
int i,j;
long sum=0;
int u;
clock_t start,end;
start=clock();
for(u=0;u<1000;u++)//受系统分配内存的限制,数组不能太高维,于是用循环多次来使得执行时间更长。
{
for(i=0;i<1000;i++)//先读行后读列
{
for(j=0;j<1000;j++)
{
sum+=arr[i][j];
}
}
}
end=clock();
double dur=(end-start)/CLOCKS_PER_SEC;
printf("time:%f\n",dur);
}
运行时间为:1s.
不好的空间局部性代码:。
#include <stdio.h>
#include <time.h>
int main()
{
long int arr[1000][1000]={1};
int i,j;
long sum=0;
int u;
clock_t start,end;
start=clock();
for(u=0;u<1000;u++)//受系统分配内存的限制,数组不能太高维,于是用循环多次来使得执行时间更长。
{
for(j=0;j<1000;j++)//先读列后读行
{
for(i=0;i<1000;i++)
{
sum+=arr[i][j];
}
}
}
end=clock();
double dur=(end-start)/CLOCKS_PER_SEC;
printf("time:%f\n",dur);
}
运行时间为:6s.