您的位置:首页 > 编程语言 > C语言/C++

cpu数组不同的访问方式的性能测试

2014-04-30 13:29 274 查看
性能测试 程序输出:

1:temp =  array[i]*i:  2430.0 ms

2:temp = GET(array,i) *i:  2430.0 ms

3:temp = get(array,i)*i:  2840.0 ms

4:int a = get(array,i);temp = a*i:  3370.0 ms

5:int a = array[i];temp =  a*i;:  2010.0 ms

6:temp =  *(array+i)*i:  2430.0 ms

7:temp =  *(array+i)*i:  2010.0 ms

其中,GET是宏定义,get是函数。

显然,1,2,6是一样的,符合预期。(当然有时不一样,但很接近)

3 通过函数调用来访问,时间长点,符合预期。

4 在3的基础上,还多了次赋值,时间长电,符合预期。

5和7 就不可思议了,她在1的基础上错了次赋值,时间竟然变短了。

测试代码

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;

#define GET(array,index) array[index]

int get(int *array,int index)
{
return array[index];
}

int main(void)
{
clock_t start,stop;
float   elapsedTime;
int rounds = 10000;

int array_size = 100000;
int *array = new int[array_size];
for(int i=0;i<array_size;i++)
{
array[i]=i;
}
int temp = 0;

start = clock();
for(int round=0;round<rounds;round++)
{
for(int i=0;i<array_size;i++)
{
temp =  array[i]*i;
}
}
stop= clock();
elapsedTime = (float)(stop - start) /
(float)CLOCKS_PER_SEC * 1000.0f;
printf( "1:temp =  array[i]*i:  %3.1f ms\n", elapsedTime );

start = clock();
for(int round=0;round<rounds;round++)
{
for(int i=0;i<array_size;i++)
{
temp = GET(array,i) *i;
}
}
stop= clock();
elapsedTime = (float)(stop - start) /
(float)CLOCKS_PER_SEC * 1000.0f;
printf( "2:temp = GET(array,i) *i:  %3.1f ms\n", elapsedTime );

start = clock();
for(int round=0;round<rounds;round++)
{
for(int i=0;i<array_size;i++)
{
temp = get(array,i)*i;
}
}
stop= clock();
elapsedTime = (float)(stop - start) /
(float)CLOCKS_PER_SEC * 1000.0f;
printf( "3:temp = get(array,i)*i:  %3.1f ms\n", elapsedTime );

start = clock();
for(int round=0;round<rounds;round++)
{
for(int i=0;i<array_size;i++)
{
int a = get(array,i);
temp = a*i;
}
}
stop= clock();
elapsedTime = (float)(stop - start) /
(float)CLOCKS_PER_SEC * 1000.0f;
printf( "4:int a = get(array,i);temp = a*i:  %3.1f ms\n", elapsedTime );

start = clock();
for(int round=0;round<rounds;round++)
{
for(int i=0;i<array_size;i++)
{
int a = array[i];
temp =  a*i;
}
}
stop= clock();
elapsedTime = (float)(stop - start) /
(float)CLOCKS_PER_SEC * 1000.0f;
printf( "5:int a = array[i];temp =  a*i;:  %3.1f ms\n", elapsedTime );

start = clock();
for(int round=0;round<rounds;round++)
{
for(int i=0;i<array_size;i++)
{

temp =  *(array+i)*i;
}
}
stop= clock();
elapsedTime = (float)(stop - start) /
(float)CLOCKS_PER_SEC * 1000.0f;
printf( "6:temp =  *(array+i)*i:  %3.1f ms\n", elapsedTime );

start = clock();
for(int round=0;round<rounds;round++)
{
for(int i=0;i<array_size;i++)
{
int a = *(array+i);
temp =  a*i;
}
}
stop= clock();
elapsedTime = (float)(stop - start) /
(float)CLOCKS_PER_SEC * 1000.0f;
printf( "7:temp =  *(array+i)*i:  %3.1f ms\n", elapsedTime );

return 0;
}


发现貌似是乘以i的原因导致那个奇怪的问题,

把乘以i改为乘以1或者2之类的,貌似就不会的。

但是如果是乘以i+1的话还是很不符合预期。

看来要看一下汇编代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息