中国开发网: 论坛: 程序员情感CBD: 贴子 512163
周星驰
有意思,我也测了下,但是我这里结果差不多,另外使用goto的sum2版本要快那么一些。
编译器是VC8,默认max speed优化
程序输出(test0调用sum2,test1调用sum2x2,test2调用sum3就是goto版本的sum2,各循环10次):
test0: 4294961374
test1: 4294961499
test2: 4294740109
test0: 4294961530
test1: 4294961499
test2: 4294739140
test0: 4294961609
test1: 4294961624
test2: 4294742530
test0: 4294961640
test1: 4294961577
test2: 4294745109
test0: 4294961577
test1: 4294961640
test2: 4294744671
test0: 4294961624
test1: 4294961655
test2: 4294744156
test0: 4294961608
test1: 4294961671
test2: 4294743187
test0: 4294961640
test1: 4294961717
test2: 4294745031
test0: 4294961515
test1: 4294961561
test2: 4294744593
test0: 4294961593
test1: 4294961702
test2: 4294744702

测试程序:
#include <windows.h>
#include <iostream>
using namespace std;

typedef double data_type;

data_type sum1(data_type volatile data[], unsigned int N)
{
volatile unsigned int i;
data_type sum = 1;
for (i = 0; i < N; i++)
{
sum = sum *data[i];
}
return sum;
}
data_type sum2(data_type volatile data[], unsigned int N)
{
volatile unsigned int i;
data_type sum = 1;
unsigned int NN = N-2;
for (i = 0; i < NN; i+=2)
{
sum *= data[i];
sum *= data[i+1];
}
for ( ;i < N; i++)
sum *= data[i];
return sum;
}
data_type sum2x2(data_type volatile data[], unsigned int N)
{
volatile unsigned int i;
data_type sum1 = 1, sum2 = 1;
unsigned int NN = N-2;
for (i = 0; i < NN; i+=2)
{
sum1 *= data[i];
sum2 *= data[i+1];

}
for ( ;i < N; i++)
sum1 *= data[i];
return sum1 * sum2;
}
data_type sum3(data_type volatile data[], unsigned int N)
{
volatile unsigned int i = 0;
data_type sum = 1;
unsigned int NN = N-2;
loop1:
sum *= data[i];
sum *= data[i+1];
i += 2;
if ( i < NN )
goto loop1;
loop2:
sum *= data[i];
++ i;
if ( i < N )
goto loop2;
return sum;
}

static data_type volatile data_[1024] = { 0 };

void test0()
{
DWORD dwStart = GetTickCount();
for ( volatile int i = 0; i < 1024 * 1024; ++ i )
sum2( data_, 1024 );
DWORD dwEnd = GetTickCount();
cout << __FUNCTION__ << ": " << ( dwStart - dwEnd ) << endl;
}

void test1()
{
DWORD dwStart = GetTickCount();
for ( volatile int i = 0; i < 1024 * 1024; ++ i )
sum2x2( data_, 1024 );
DWORD dwEnd = GetTickCount();
cout << __FUNCTION__ << ": " << ( dwStart - dwEnd ) << endl;
}

void test2()
{
DWORD dwStart = GetTickCount();
for ( volatile int i = 0; i < 1024 * 1024; ++ i )
sum3( data_, 1024 );
DWORD dwEnd = GetTickCount();
cout << __FUNCTION__ << ": " << ( dwStart - dwEnd ) << endl;
}

typedef void ( *test_proc )();

test_proc tests[] =
{
test0,
test1,
test2
};

int _tmain(int argc, _TCHAR* argv[])
{
int nTest = 0;
for ( volatile int i = 0; i < 10; ++ i )
{
tests[0]();
tests[1]();
tests[2]();
}
return 0;
}

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录