注册 登录
编程论坛 Matlab

看看matlab内置函数的效率

abingchem 发布于 2006-06-12 21:33, 2094 次点击

一直都说向量化函数的效率很高,编程比较了一下,果然
求1到1000000整数的和,分别用for循环,while循环,和sum函数,运行显示如下:

ans =

using sum


s =

5.0000e+011


elapsed_time =

0.0470


ans =

using for


s =

5.0000e+011


elapsed_time =

1.1090


ans =

using while


s =

5.0000e+011


elapsed_time =

2.7500


化成整数的时间费用比就是1:24:58,呵呵,差得比较大啊

11 回复
#2
zhangenter2006-06-13 00:54

tic;
i=1:1000000;
s=sum(i)
disp('use sum');toc

tic;s=0;
for i=1:1000000
s=s+i;
end
s
disp('use for');toc

tic;s=0;i=0;
while i<1000000
s=s+i;
i=i+1;
end
s
disp('use while');toc
结果

s =

5.0000e+011

use sum
Elapsed time is 0.046000 seconds.

s =

5.0000e+011

use for
Elapsed time is 0.016000 seconds.

s =

5.0000e+011

use while
Elapsed time is 0.0015000 seconds.
和楼主差别较大,后来我将程序段的顺序变了下,for最先执行,sum最后,变化比较大
s =

5.0000e+011

use for
Elapsed time is 1.969000 seconds.

s =

5.0000e+011

use while
Elapsed time is 2.438000 seconds.

s =

5.0000e+011

use sum
Elapsed time is 0.046000 seconds.
不过当三个程序段放到三个m文件里分别执行的时候,还是
use for
Elapsed time is 0.015000 seconds.
use while
Elapsed time is 0.016000 seconds.
use sum
Elapsed time is 0.047000 seconds.
不知道楼主的for和while用的什么程序段

#3
abingchem2006-06-13 12:19

和你的第一种处理方法一样,不过偶的版本是6.5
你应该是7.0吧

#4
zhangenter2006-06-13 13:22

是的,版本不同居然还有这区别了

#5
Genial2006-06-13 15:08
各段程序处理环境都不完全相同!
matlab的时间消耗很多时候在内存分配上,你每种情况处理前先用clear all清除了变量空间再试试。

#6
zhangenter2006-06-13 16:19
以下是引用Genial在2006-6-13 15:08:26的发言:
各段程序处理环境都不完全相同!
matlab的时间消耗很多时候在内存分配上,你每种情况处理前先用clear all清除了变量空间再试试。

这点我也想到了. 放在三个程序段里分别执行的时候,我本来就用过clear的,贴子上的那个结果也是用了clear的,后来觉得是不是用了clear才和楼主时间差这么多,所以就删掉了.你试出来什么结果

#7
Genial2006-06-13 17:35
没测过,matlab7对循环采用了java虚拟机进行加速,据说是。 另外多重for循环表现得比较明显。
#8
abingchem2006-06-13 19:59

按Genial说的是这样子的:

>> clear all
tic;s=0;
for i=1:1000000
s=s+i;
end
s
disp('use for');toc
clear all
tic;s=0;i=0;
while i<1000000
s=s+i;
i=i+1;
end
s
disp('use while');toc
clear all
tic;
i=1:1000000;
s=sum(i)
disp('use sum');toc

s =

5.0000e+011

use for

elapsed_time =

1.1870


s =

5.0000e+011

use while

elapsed_time =

3.0780


s =

5.0000e+011

use sum

elapsed_time =

0.0470

◣◣◣◣◣◣去掉代码中间的clear all的执行结果是◥◥◥◥◥◥

s =

5.0000e+011

use for

elapsed_time =

1.2030


s =

5.0000e+011

use while

elapsed_time =

3.0780


s =

5.0000e+011

use sum

elapsed_time =

0.0310

用sum还是比较快。一般书中推荐的优化matlab执行效率时,也包括了向量化执行的方法

#9
abingchem2006-06-13 20:04
以下是引用zhangenter在2006-6-13 0:54:47的发言:

。。。。。。。。

不过当三个程序段放到三个m文件里分别执行的时候,还是
use for
Elapsed time is 0.015000 seconds.
use while
Elapsed time is 0.016000 seconds.
use sum
Elapsed time is 0.047000 seconds.
不知道楼主的for和while用的什么程序段

怎么会这样子呢?偶很想知道。。。

#10
zhangenter2006-06-13 20:43

那你自己试一下哈,别放一起执行,分开执行看看

#11
zhangenter2006-06-13 21:03

还有,我在2楼已经说的,三个程序段执行顺序不一样,变化很大.for→while→sum的顺序,出来的时间是:
use for
Elapsed time is 1.969000 seconds.
use while
Elapsed time is 2.438000 seconds.
use sum
Elapsed time is 0.046000 seconds.
如果是sum→for→while的顺序,出来的时间是
use for
Elapsed time is 0.015000 seconds.
use while
Elapsed time is 0.016000 seconds.
use sum
Elapsed time is 0.047000 seconds.
这两种情况都是把程序存在m文件中执行的,如果你直接全部复制到命令窗中执行的话,就算是
sum→for→while的顺序,时间也很大
use sum
Elapsed time is 0.047000 seconds.
use for
Elapsed time is 1.297000 seconds.
use while
Elapsed time is 3.094000 seconds.
大胆的猜想下楼主大概时间就是这样得到的.不过这应该不准.
把三个程序段扔到三个文件里分别执行得到的答案应该是最准确的:
use sum
Elapsed time is 0.047000 seconds.
use for
Elapsed time is 0.015000 seconds.
use while
Elapsed time is 0.016000 seconds.
虽然我说不出什么道理,但实践了很多次,事实就是如此


#12
abingchem2006-06-13 22:32

呵呵,不行啦,我这里for循环竟然运行时间时而为0,时而为0.016,反而sum用的时间最多

可能这样的检测方法不对,因为sum中分配的内存空间太多了。

1