找回密码
 欢迎注册
楼主: cn8888

[讨论] 为什么小循环里面套大循环比大循环里面套小循环要快?

[复制链接]
 楼主| 发表于 2014-4-16 17:58:54 | 显示全部楼层
wayne 发表于 2014-4-16 14:10
看来perl的loop控制还是偏简单了点。
我刚才测试了下,发现在Mathematica里面 这种差别很小。

Timing[Do[2, {i, 1, 10}, {j, 2*1, 10^7}]]
结果是:{14.328, Null}
Timing[Do[2, {j, 1, 2*10^7}, {i, 1, 10}]]
结果是:{30.937, Null}
车别也是很大的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-4-16 18:00:59 | 显示全部楼层
Timing[Do[Print[{i, j}], {i, 1, 3}, {j, 1, 3}]]
{1,1}

{1,2}

{1,3}

{2,1}

{2,2}

{2,3}

{3,1}

{3,2}

{3,3}
这个结果告诉我们前面的是外循环
mathematica同样也是小循环在外面更省时间
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-4-16 18:02:36 | 显示全部楼层
不论如何, perl有这种差别, mathematica也有这种差别,
我觉得这个差别有可能是普遍的.
有没有用别的语言也测试一下,然后把报告结果粘贴上来??????
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-4-18 09:46:29 | 显示全部楼层
看来这儿没人能解决这个问题.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-4-18 11:12:00 | 显示全部楼层
cn8888 发表于 2014-4-16 17:58
Timing[Do[2, {i, 1, 10}, {j, 2*1, 10^7}]]
结果是:{14.328, Null}
Timing[Do[2, {j, 1, 2*10^7}, {i, ...

我用是Mathematica 9.0.1,Linux版本,之前我说的差别小,是因为我最大循环是10^6,现在依你的意思,换成10^7,截图为证吧,免得你不相信:
Screenshot from 2014-04-18 11:11:27.png

点评

不好意思, 我代码写错了,连累你也写错了,那个2应该乘到10^7前面的,结果写错地方了  发表于 2014-4-18 12:40
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-4-18 11:13:52 | 显示全部楼层
在这泛泛的讨论效率是无意义,浪费时间的。
每一种编程语言都有自己的实现方式。

====
即便是讨论编译后的目标对象是机器语言,最接近机器的硬件体系架构的的C/C++语言这种loop循环的效率 也意义不大,
因为很多现代的C/C++编译器都有优化处理,程序员应该把心思放在算法层次,而不是语言层次(况且语言是会随时会更新换代的)。
http://en.wikipedia.org/wiki/Loop_nest_optimization
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-4-18 12:30:57 | 显示全部楼层
突然发现自己的mathematica代码输入有问题
Timing[Do[2, {i, 1, 10}, {j, 1, 5*10^7}]]
{66.734, Null}
Timing[Do[2, {j, 1, 5*10^7}, {i, 1, 10}]]
{70.5, Null}
不过依旧还是小循环在外面节省时间
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-4-18 12:38:14 | 显示全部楼层
In[6]:= Big = 10^8

Out[6]= 100000000

In[7]:= Timing[Do[2, {i, 1, 10}, {j, 1, Big}]]

Out[7]= {134.719, Null}

In[8]:= Timing[Do[2, {j, 1, Big}, {i, 1, 10}]]

Out[8]= {140.438, Null}
有理由相信,当Big越来越大的时候,这个差距会越来越大,至少我看出了这个趋势

所以我想追究出幕后的原因
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-4-18 19:24:46 | 显示全部楼层
差距并没有变大,140.438/134.719 和 70.5/66.734没有本质区别,前者反而更小。

点评

5*10^7是70.5-66.734=3.766 ;10^8是140.438-134.719=5.719. 时间增加了,你说呢?  发表于 2014-4-20 15:32
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-4-18 19:31:30 | 显示全部楼层
解释执行的代码效率不是很高,特别对于每个循环,每层结束它会需要一些特殊代码来处理,会产生一些额外时间。特别对于你这种空循环,这个时间的比例会显得很大。但是对于C/C++之类的编译后的代码,这种时间几乎不会存在
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-22 07:03 , Processed in 0.056575 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表