小弟最近无聊写程序玩玩,结果发现一个问题,环境是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;
时间也将缩短,难道会是跟数学运算有关系???
有兴趣的高手们,可以最近试试
代码如下:
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;
时间也将缩短,难道会是跟数学运算有关系???
有兴趣的高手们,可以最近试试
解决方案 »
- ●●● 为何在因特网环境下我的客户端不能连接服务器?(TCP、socket) ●●●
- 请问多机串联联网时的网络传输如何实现?
- 请教高手 难题呀 那位哥们帮个忙呀 急急急急急急急 急!!!!!!! 我等这急用哟 一点资料都找不到郁闷呀
- 请问如何style是icon的list control的每个item加上tooltip?抱歉只剩70分了。
- ATL组件中如何才能返回记录集指针?
- 关于浏览器对象的取得方法?
- 我在窗口里加了一个EDIT控件并用一个变量控制他的内容但我用语\n怎么也换不了行
- 大家能不能帮我用C++写个小程序呢?
- 想跳槽的高手请进!
- 怎么在tcp包中填充一段无意义的字节
- 问一个关于kernel object和private namespace的问题
- 内嵌ie浏览器 截获页面跳转后在自己客户端中打开跳转的url,新浪广告失去焦点
如果让你来写个编译器,你会怎么处理什么也不干的空语句,你会怎么处理只定义而不引用的变量?
变换关键字搜索完百度、google前20页都还找不到答案的情况下,你才可以放话说80%的人没有遇到过。
因为把nTemp++移到1的位置后,优化过程中发现计算nUse和nvalue_temp无意义,也就没有计算这两个变量
时间当然少了(pow计算很花时间的)改成
nUse = 0;
nvalue_temp = 0;
当然比计算nvalue_temp = (int)pow(2,8-nValue-1);要快得多得多。
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);
时间差的不是一点两点哦。