手头一时没找到相关指令周期的资料及相关算法,随便写了个程序测了一下,
实验结果为运行N次的代价:
1: int + int , time=12
1: int - int , time=11
1: int * int , time=13
1: int / int , time=48
1: int64 + int 64, time=24
1: int64 * int 64, time=109
1: int64 / int 64, time=162
1: double + double, time=87
1: double * double, time=99
1: double / double, time=173
----------------- 源代码 ---------------------------------------------
void main_test()
{
CTime tFrom, tTo;
#define TOTAL_TIME_CAL 614748
#define AA(a) X(a) X(a) X(a) X(a) X(a) X(a)X(a) X(a) X(a) X(a) X(a) X(a) X(a) X(a) X(a) X(a)
#define X(a)\a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\ a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\ a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;a;\
int __i;
int i1,i2,i3;
__int64 ii1,ii2,ii3;
i1=9876543;i2=1234567;
ii1=98765432123;ii2=1234567;
int time_diff,time_diff1;
// ---- time to deduction------------------------------------------------------------------
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
//do nothing here, maybe thecompiler can totally remove this loop-code for optimization.
}
tTo = CTime::GetCurrentTime();
time_diff1 = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1:time_wasted=%d \r\n", time_diff1);
// after using macro AA(), the consumption canbe thought as 0
//------------------------------------------------------------------------------------------
//time_diff1 = 0;
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(i3 = i1 + i2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: int + int , time=%d \r\n",time_diff-time_diff1);
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(i3 = i1 - i2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: int - int , time=%d \r\n",time_diff-time_diff1);
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(i3 = i1 * i2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: int * int , time=%d \r\n",time_diff-time_diff1);
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(i3 = i1 / i2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: int / int , time=%d \r\n",time_diff-time_diff1);
//----------------------------------------------------------------------------------------------
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(ii3 = ii1 + ii2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: int64 + int 64, time=%d \r\n",time_diff-time_diff1);
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(ii3 = ii1 * ii2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: int64 * int 64, time=%d \r\n",time_diff-time_diff1);
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(ii3 = ii1 / ii2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: int64 / int 64, time=%d \r\n",time_diff-time_diff1);
//---------------------------------------------------
double f1= 1234567.89123;
double f2= 3.789543434;
double f3;
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(f3 = f1 + f2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: double + double, time=%d \r\n",time_diff-time_diff1);
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(f3 = f1 * f2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: double * double, time=%d \r\n",time_diff-time_diff1);
tFrom = CTime::GetCurrentTime();
for(__i = 0; __i < TOTAL_TIME_CAL;__i++)
{
AA(f3 = f1 / f2);
}
tTo = CTime::GetCurrentTime();
time_diff = (int)((tTo -tFrom).GetTotalSeconds());
TRACE(" 1: double / double, time=%d \r\n",time_diff-time_diff1);
}