[问题] 两层for循环的效果

楼主: mh2ant (环球科大扛坝子)   2017-05-25 12:39:02
大家好
今天去面试主管问我一题
第一个状况
for i=1~100
for j=1~1000000
s=s+i*j
第二个状况
for i=1~100000
for j=1~100
s=s+i*j
哪一个比较快
我是回答第一个状况
因为我觉得跳出循环回到上个循环比较少次
所以会比较快
主管说是正确答案
然后有解释一番
但我有点忘记了
想请问各位大大有没有详尽的解释
谢谢
作者: andrenvq57 (喂!威,喂?)   2017-05-25 13:41:00
1000000^100=10^600 < 100^1000000=10^2000000
作者: moebear (萌熊)   2017-05-25 13:53:00
为啥是指数
作者: libertyleave (SSLin)   2017-05-25 14:21:00
两种状况循环跑不一样多次耶 是否有一边多一个0
楼主: mh2ant (环球科大扛坝子)   2017-05-25 14:55:00
对抱歉少一个0,因为在捷运上急急忙忙发文没看清楚
作者: kokal (细菌)   2017-05-25 15:13:00
branch prediction的问题吧
作者: Hazukashiine (私は幸せです)   2017-05-25 15:27:00
实际上有很高的机率 这两个会一样快i 跟 j 都是 local 很容易被编译器优化掉s 也没被存取 基本上可能被判定为 dead code (DCE)
作者: johnlinvc (阿翔)   2017-05-25 15:36:00
-Ofast会直接回传答案XD https://godbolt.org/g/da8rbt
作者: ersfw4418 (隐身术)   2017-05-25 16:43:00
第一种会比较快可能是没优化情况j生成毁灭次数较少但像矩阵运算等 可能会与cache access有关 效率就不一定谁好 内层loop次数少 也可能优化时直接unrolling有错误请纠正小弟
作者: feeya (24 August 升格为乡民)   2017-05-26 16:52:00
把状况极端化 2x1000000 跟 1000000x2 哪个比较快
作者: MOONRAKER (㊣牛鹤鳗毛人)   2017-05-28 10:43:00
算一百万个常数实在没什么意思
作者: friendever (hi~)   2017-05-30 17:51:00
branch prediction是你要的关键字

Links booklink

Contact Us: admin [ a t ] ucptt.com