基本算术的计算代价

来源:互联网 发布:中国在非洲 知乎 编辑:程序博客网 时间:2024/04/29 16:54

手头一时没找到相关指令周期的资料及相关算法,随便写了个程序测了一下,

实验结果为运行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);
}

 

0 0