两个循环的区别

evan_xie 2008-04-01 08:04:47
今天碰到问两个循环有什么区别,在这了问问大家:)

循环一:
for(int i=0;i<10;i++)
for(int j=0;j<100;j++)
{}

循环二:
for(int i=0;i<100;i++)
for(int j=0;j<10;j++)
{}

问两个循环的区别?

...全文
541 54 打赏 收藏 转发到动态 举报
写回复
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
evan_xie 2008-05-01
  • 打赏
  • 举报
回复
学习了。最近比较忙,一直没有结贴,我在这里道歉了:)
xiantongyuan 2008-04-03
  • 打赏
  • 举报
回复
其实按照现在的硬件设备性能来说,那两个的差别已经可以不提了,但是硬要区分,那肯定是里边的循环大好了,里边循环多栈被破坏的次数就少点。
longlongyu 2008-04-03
  • 打赏
  • 举报
回复
比如 外循环为2,内循环为1,第1个就是10*2+100*1=120,第二个100*2+10*1=210 就这个意思吧
Vesslan_WangQi 2008-04-03
  • 打赏
  • 举报
回复
学习
hoohag 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 qmm161 的回复:]
引用 41 楼 hoohag 的回复:
cache line 的确是有这样特性!

但是循环10次就是取10个索引的元素吗?就这个题目而言肯定不是吧,而且这里提 cache line 的概念似乎也不合适!
[/Quote]

呵呵, 只是为了说明简便, 举了一个例子. 在有些地方, 尤其是有个小循环可以展开的时候, 的确不是很适合把小循环放在外层. 举个极端的例子, 10 * 10000的 这种肯定是10000次循环加上10次循环的展开要优于 10 * 10000次的循环. 对于cache line, 我只是作为一个例子来说, 10个循环的展开是可能放在一个高速缓存行中的. 再说, 循环的性能在一些场合和缓存行的利用率有关, 尤其是在用循环做内存寻址的时候, 比如操作一个位图, 一个2维堆上数据等等.这个是有大量是实验数据来证明这个问题.
WingForce 2008-04-03
  • 打赏
  • 举报
回复
编写意义更加清晰的代码更加关键,选择哪种主要取决于哪种表达的意义更接近人类正常思考行为

[Quote=引用 20 楼 WuBill 的回复:]
程序员很容易做到的事为什么要留给编译器呢?
[/Quote]

我个人的看法是,机器很容易做的事情为什么要留给程序员做呢?
qmm161 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 hoohag 的回复:]
呵呵,的确的确, 不要太相信林锐的话, 他不是标准. 说实话, 对于一些地方10 * 100的循环肯定不是最好的. 相反, 自己更加倾向于一个100的循环, 每次循环里面操作 10 个索引的元素, 是小循环展开, 而不是循环. 这样做, 高速缓存的利用率反而会增高, 因为CPU每次都是会去访问一个64个字节的高速缓存行, 而不是4个byte的指令. 高速缓存行的概念这里就不细说, 对于10个索引操作的指令, 完全是可能放在一个高速缓存行里的, 这样CPU每次循…
[/Quote]

cache line 的确是有这样特性!

但是循环10次就是取10个索引的元素吗?就这个题目而言肯定不是吧,而且这里提 cache line 的概念似乎也不合适!
liluyemin 2008-04-03
  • 打赏
  • 举报
回复
第一种应该慢点
局部变量j要被释放100次
skyful123 2008-04-03
  • 打赏
  • 举报
回复
学习~~
abupie 2008-04-02
  • 打赏
  • 举报
回复
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
lily604 2008-04-02
  • 打赏
  • 举报
回复
三楼 学习了
lily604 2008-04-02
  • 打赏
  • 举报
回复
因为进入循环的次数少了吧
ppcat_001 2008-04-02
  • 打赏
  • 举报
回复
太小瞧编译器了
这种简单的直接循环肯定给优化掉了
大的另说~
  • 打赏
  • 举报
回复
拜读
ggy11687 2008-04-02
  • 打赏
  • 举报
回复
学习受用 谢谢
sheenl 2008-04-02
  • 打赏
  • 举报
回复
所有效率有关的问题, 请自行测试之后再下判断.
事实有时候和你的想像完全不一样.
Alix-Lei 2008-04-02
  • 打赏
  • 举报
回复
3楼正确,优化问题
独孤过儿 2008-04-02
  • 打赏
  • 举报
回复

[root@cv0005759d1 stack]# cat test.s
.file "test.c"
.text
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $0, -8(%rbp)
jmp .L2
.L3:
movl $0, -4(%rbp)
jmp .L4
.L5:
addl $1, -4(%rbp)
.L4:
cmpl $99, -4(%rbp)
jle .L5
addl $1, -8(%rbp)
.L2:
cmpl $9, -8(%rbp)
jle .L3
movl $0, %eax
leave
ret
.LFE2:
.size main, .-main
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.ident "GCC: (GNU) 4.1.2 20070626 (Red Hat 4.1.2-14)"
.section .note.GNU-stack,"",@progbits

[root@cv0005759d1 stack]# cat test1.S
.file "test.c"
.text
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $0, -8(%rbp)
jmp .L2
.L3:
movl $0, -4(%rbp)
jmp .L4
.L5:
addl $1, -4(%rbp)
.L4:
cmpl $9, -4(%rbp)
jle .L5
addl $1, -8(%rbp)
.L2:
cmpl $99, -8(%rbp)
jle .L3
movl $0, %eax
leave
ret
.LFE2:
.size main, .-main
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.ident "GCC: (GNU) 4.1.2 20070626 (Red Hat 4.1.2-14)"
.section .note.GNU-stack,"",@progbits
taodm 2008-04-02
  • 打赏
  • 举报
回复
一般程序员的所谓“优化”其实大多是“劣化”。
最好的优化就是写下清晰、简单的代码,开编译器的最优化编译。
当程序员自己开始“优化”的时候,大多就阻碍了编译器的优化,结果就是“劣化”。
WuBill 2008-04-02
  • 打赏
  • 举报
回复
弱弱的问一下,
先不管优化后的结果是否一样,
程序员很容易做到的事为什么要留给编译器呢?

还有就是,提问者想看看你有没有优化程序的意识。

加载更多回复(34)
相关推荐

63,593

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下