有如下两行代码,评估两段代码实际运行所用的时间,是否相同

wyjlhf 2008-12-03 03:34:29
各位好,我是一个新手,最近有一道题不理解,希望在白忙之中帮我看一下,我急用,晚上八点之前就要交上去!谢谢!
有如下两行代码,评估两段代码实际运行所用的时间,是否相同。并用实际数据说明。 望给出论证过程!谢谢!
代码一:
void fun(void)
{
unsigned long i,j;
for(i=0;i <1000000;i++)
{
for(j=0;j <100;j++)
{
_asm(nop);
}
}
}
代码2
void fun(void)
{
unsigned long i,j;
for(i=0;i <100;i++)
{
for(j=0;j <1000000;j++)
{
_asm(nop);
}
}
}

我觉得运行时间应该不同 但是不知道为什么,望各位帮忙。谢谢!
...全文
172 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjtursh 2008-12-03
  • 打赏
  • 举报
回复
第二个效率更高吧 看到好多资料都是这么说的

除去上面大家说的 还有就是流水线操作

kiffa 2008-12-03
  • 打赏
  • 举报
回复
支持10楼和13楼。
mifeixq 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hhyttppd 的回复:]
引用 14 楼 hhyttppd 的回复:
各位应该都跑一跑楼主的代码,再仔细考虑一下,这个问题好像不是我们想像那样,fun1耗的时间比fun1要多(debug版)


晕,我又昏了,楼上各位好像都是这个意思,对不住啊。。。。今天不知道咋了,我靠。。。
[/Quote]

哈哈~~
Qlaiaqu 2008-12-03
  • 打赏
  • 举报
回复
【建议4-4-1】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
林锐的<高质量C++/C编程指南>
http://topic.csdn.net/u/20071206/20/5ae1a8f9-fab5-443c-a2ea-af1d755f5de1.html
hhyttppd 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hhyttppd 的回复:]
各位应该都跑一跑楼主的代码,再仔细考虑一下,这个问题好像不是我们想像那样,fun1耗的时间比fun1要多(debug版)
[/Quote]

晕,我又昏了,楼上各位好像都是这个意思,对不住啊。。。。今天不知道咋了,我靠。。。
hhyttppd 2008-12-03
  • 打赏
  • 举报
回复
前一个耗的时间比后一个要多
hhyttppd 2008-12-03
  • 打赏
  • 举报
回复
各位应该都跑一跑楼主的代码,再仔细考虑一下,这个问题好像不是我们想像那样,fun1耗的时间比fun1要多(debug版)
lbh2001 2008-12-03
  • 打赏
  • 举报
回复
没什么理由好说的,实在要说也是cache命中的问题,多重循环时
一般内层循环次数大于外层的次数是比较好的结构
zjj9850 2008-12-03
  • 打赏
  • 举报
回复

for(i=0;i<100;i++){
00413690 mov dword ptr [i],0
00413697 jmp fun1+42h (4136A2h)
00413699 mov eax,dword ptr [i]
0041369C add eax,1
0041369F mov dword ptr [i],eax
004136A2 cmp dword ptr [i],64h
004136A6 jge fun1+9Dh (4136FDh)
for (j=0;j<10;j++)
004136A8 mov dword ptr [j],0
004136AF jmp fun1+5Ah (4136BAh)
004136B1 mov eax,dword ptr [j]
004136B4 add eax,1
004136B7 mov dword ptr [j],eax
004136BA cmp dword ptr [j],0Ah
004136BE jge fun1+9Bh (4136FBh)

从这个汇编代码上看~~
两者是没什么区别的~~
而且我检测过时间~~
误差只是由于CPU的原因引起的~~
我个人认为~~
从宏观上看~~区别就是行和列的区别~~
我记得数据结构老师当时讲过~~
这种多重循环的复杂度就是i*j~~
如果从矩阵上看~就是矩阵之间的置换了~~没其他什么区别了~~
devil_zuiai 2008-12-03
  • 打赏
  • 举报
回复
评估两段代码实际运行所用的时间
=============
关于这个问题是不是可以把代码中的所有运算,比如
加运算,比较运算等做的次数统计一下,
然后再统计一下在当前系统中,这些运算所需的
指令周期为几个,然后估算一下总时间?


举例说明:
把第一个代码比第二个代码多做的运算单独
写个程序。
Rainstorey 2008-12-03
  • 打赏
  • 举报
回复
通常第二个效率高些。(更少打乱流水线,更多利用高速缓存)
devil_zuiai 2008-12-03
  • 打赏
  • 举报
回复
第一个j不满足条件的判断好像也比第二个多。
jiww03 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 wyjlhf 的帖子:]
各位好,我是一个新手,最近有一道题不理解,希望在白忙之中帮我看一下,我急用,晚上八点之前就要交上去!谢谢!
有如下两行代码,评估两段代码实际运行所用的时间,是否相同。并用实际数据说明。 望给出论证过程!谢谢!
代码一:
void fun(void)
{
unsigned long i,j;
for(i=0;i <1000000;i++)
{
for(j=0;j <100;j++)
{
_asm(nop);
}
}
}
代码2
void fun(void)
{
unsigned long i,j;
for(i=0;i <100;i++)…
[/Quote]

你看这个程序应该好懂一些
代码一:
void fun(void)
{
unsigned long i = 0,j = 0;
for(i=0;i <1000000;i++)
{
if(j==0)
{
_asm(nop);
}
}
}
代码2
void fun(void)
{
unsigned long i,j;
if(i==0)
{
for(j=0;j <1000000;j++)
{
_asm(nop);
}
}
}

可以看出来代码一判断了1000000次j==0
而代码二判断了1次


devil_zuiai 2008-12-03
  • 打赏
  • 举报
回复
第一个
j=0;做了1000000次

第二个
j=0;做了100次
jolly_ye 2008-12-03
  • 打赏
  • 举报
回复
第一个是执行1000000个100次,第二个是执行100个1000000次,
hhyttppd 2008-12-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hhyttppd 的回复:]
就debug而论(编译器未做优化),我觉得差别就差在对内层循环的临界条件判断上(x86可能执行jae,或jne之类的指令)
第一条情况,总共需要:
count = 1000000 + 1000000 * 100
第二情况:
count = 100 + 100 *  1000000

差在这1000000 - 100 次判断上。
[/Quote]
以上不正确的。。。
对不起,昏掉了。。。。
hhyttppd 2008-12-03
  • 打赏
  • 举报
回复
就debug而论(编译器未做优化),我觉得差别就差在对内层循环的临界条件判断上(x86可能执行jae,或jne之类的指令)
第一条情况,总共需要:
count = 1000000 + 1000000 * 100
第二情况:
count = 100 + 100 * 1000000

差在这1000000 - 100 次判断上。
GavinFj 2008-12-03
  • 打赏
  • 举报
回复
看不出有区别。。。帮顶下。
hhyttppd 2008-12-03
  • 打赏
  • 举报
回复
学习
icesky_ff 2008-12-03
  • 打赏
  • 举报
回复
代码一退出内层循环次数为1000000次,代码二退出内层循环次数为100次
差在这了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧