看到文章https://blog.csdn.net/qq_34827674/article/details/109147330,写程序试验了一下。
1. 提升数据缓存的命中率(遍历二维数组),好像是正确的。
2. 提升指令缓存的命中率(循环遍历数组,把小于 50 的数组元素置为 0;将数组排序),不知道什么原因,试验结果没有提升速度。
程序如下:
#include "stdio.h"
#include <time.h>
#include <sys/time.h>
#include <algorithm>
using namespace std;
#define N 1000
#define N1 10000
int main(void)
{
struct timeval tpstart;
struct timeval tpend;
int array[N][N];
int i,j;
gettimeofday(&tpstart,NULL);
for(i=0; i < N; i++)
{
for(j=0; j < N; j++)
{
array[i][j] = 1;
}
}
gettimeofday(&tpend,NULL);
printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
gettimeofday(&tpstart,NULL);
for(i=0; i < N; i++)
{
for(j=0; j < N; j++)
{
array[j][i] = 1;
}
}
gettimeofday(&tpend,NULL);
printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
gettimeofday(&tpstart,NULL);
for(i=0; i < N; i++)
{
for(j=0; j < N; j++)
{
array[i][j] = 1;
}
}
gettimeofday(&tpend,NULL);
printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
gettimeofday(&tpstart,NULL);
for(i=0; i < N; i++)
{
for(j=0; j < N; j++)
{
array[i][j] = 1;
}
}
gettimeofday(&tpend,NULL);
printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
int array1[N1];
printf("\n");
for(i=0; i<N1; i++)
{
array1[i]=rand()%100;
//printf("%d ",array1[i]);
}
printf("\n");
gettimeofday(&tpstart,NULL);
for(i=0; i<N1; i++)
{
if(array1[i]<50)
{
array1[i]=0;
}
}
sort(array1,array1+N1);
gettimeofday(&tpend,NULL);
printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
//printf("\n");
//for(i=0; i<N1; i++)
//{
//printf("%d ",array1[i]);
//}
//printf("\n");
printf("\n");
for(i=0; i<N1; i++)
{
array1[i]=rand()%100;
//printf("%d ",array1[i]);
}
printf("\n");
gettimeofday(&tpstart,NULL);
sort(array1,array1+N1);
for(i=0; i<N1; i++)
{
if(array1[i]<50)
{
array1[i]=0;
}
}
gettimeofday(&tpend,NULL);
printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
//for(i=0; i<N1; i++)
//{
//printf("%d ",array1[i]);
//}
//printf("\n");
return 0;
}
用g++编译运行,结果:
第一次
time:0s,21539ms
time:0s,93967ms
time:0s,16531ms
time:0s,16554ms
time:0s,6204ms
time:0s,6070ms
第二次
time:0s,21348ms
time:0s,94609ms
time:0s,16356ms
time:0s,16607ms
time:0s,6203ms
time:0s,6081ms