小弟最近无聊写程序玩玩,结果发现一个问题,环境是vc6 2010我也试过,结果是一样的
代码如下:
int nTemp = 0;
int time_start = GetTickCount();
int nCount_top = 10000;

for(int count_index=0;count_index<nCount_top;count_index++ )
{
   for (int nType=0;nType<10;nType++)//--type
   {
      for (int nCount=50;nCount>0;nCount--)
      {
 for (int nValue=0;nValue<8;nValue++)
 {
    int nvalue_temp = (int)pow(2,8-nValue-1);
            int nUse = 124 & nvalue_temp;
            //位置1
    if (nUse == nvalue_temp)
    {
nTemp++;//位置2
    }
  }
       }
    }
}
int time_end = GetTickCount();
CString str;
str.Format(_T("---%d---%d--"),time_end - time_start,nTemp);
AfxMessageBox(str);问题说明:
程序主要测试代码运行时间。如果将“nTemp++;”这行代码由位置2移至位置1的话,整个程序的运行时间就会
少很多,我一直没理解为什么会这样,还有请高手解答。。
还有,如何在不改变for循环语句嵌套顺序的前提下,解决这个问题???
我也有进一步验证过,如果将
int nvalue_temp = (int)pow(2,8-nValue-1);
int nUse = 124 & nvalue_temp;
改成
int nvalue_temp = 0;
int nUse = 0;
时间也将缩短,难道会是跟数学运算有关系???
有兴趣的高手们,可以最近试试

解决方案 »

  1.   

    估计楼主没有听说“优化”这个词吧。
    如果让你来写个编译器,你会怎么处理什么也不干的空语句,你会怎么处理只定义而不引用的变量?
    变换关键字搜索完百度、google前20页都还找不到答案的情况下,你才可以放话说80%的人没有遇到过。
      

  2.   

    依我看,是被优化了。我也遇到过类似问题的。
    因为把nTemp++移到1的位置后,优化过程中发现计算nUse和nvalue_temp无意义,也就没有计算这两个变量
    时间当然少了(pow计算很花时间的)改成
    nUse = 0;
    nvalue_temp = 0;
    当然比计算nvalue_temp = (int)pow(2,8-nValue-1);要快得多得多。
      

  3.   

    你试试这段程序,也是一样的:
    int x = 0;
    for (int i = 0; i < 1000000; ++i)
        for (int j = 0; j < 10000000; ++j)
           x += j;和
    int x = 0;
    for (int i = 0; i < 1000000; ++i)
        for (int j = 0; j < 10000000; ++j)
           x += j;
    printf_s("%d\n", x);
    时间差的不是一点两点哦。
      

  4.   

    位置1 if判断就没意义了,编译器有开启优化的话pow计算会被优化掉