“MATLAB(2012a 版或更高版本)不会以某种方式优化代码以防止这种好奇心吗?”
是的,如果代码在函数m 文件中,由于 JIT 编译器(即时编译器)和/或加速器,它确实如此
但是,如评论和其他答案中所述,如果可能,矢量化通常仍然是更好的选择
直接在命令行:
tic; for i=1:100000; x1 = sin(i)*[1; 1]; end; toc;
tic; for i=1:100000; x2 = sin(i).*[1; 1]; end; toc;
tic; for i=1:100000; x3 = [sin(i); sin(i)]; end; toc;
tic; for i=1:100000; tmp=sin(i); x4 = [tmp; tmp]; end; toc;
Elapsed time is 1.795528 seconds.
Elapsed time is 1.606081 seconds.
Elapsed time is 0.072672 seconds.
Elapsed time is 0.065904 seconds.
在一个函数内;
[x1,x2,x3,x4]=foo();
Elapsed time is 0.029698 seconds.
Elapsed time is 0.035248 seconds.
Elapsed time is 0.064080 seconds.
Elapsed time is 0.054499 seconds.
将函数 foo 保存为:
function [x1,x2,x3,x4]=foo()
tic; for i=1:100000; x1 = sin(i)*[1; 1]; end; toc;
tic; for i=1:100000; x2 = sin(i).*[1; 1]; end; toc;
tic; for i=1:100000; x3 = [sin(i); sin(i)]; end; toc;
tic; for i=1:100000; tmp=sin(i); x4 = [tmp; tmp]; end; toc;
end
编辑
在尝试查找支持上述声明的文档时,我意识到我犯了一个错误,它还加速了脚本 m 文件,因此函数在上面被编辑
在脚本内;
fooscript;
Elapsed time is 0.033536 seconds.
Elapsed time is 0.033720 seconds.
Elapsed time is 0.066050 seconds.
Elapsed time is 0.058428 seconds.
脚本 fooscript 包含:
tic; for i=1:100000; x1 = sin(i)*[1; 1]; end; toc;
tic; for i=1:100000; x2 = sin(i).*[1; 1]; end; toc;
tic; for i=1:100000; x3 = [sin(i); sin(i)]; end; toc;
tic; for i=1:100000; tmp=sin(i); x4 = [tmp; tmp]; end; toc;
遗憾的是,没有大量关于 JIT 和加速器(如果有的话)的文档。feature('accel','on'/'off')
但是,为了比较,您可以使用and禁用 JIT 或加速feature('jit','on'/'off')
。(注意:禁用 accel 也会禁用 jit,因为它似乎是 accel 的一部分。)
如果禁用加速,性能改进会降低,但是函数和脚本性能仍然相似,并且都比命令行快得多。
禁用 JIT 对性能没有明显影响,所以原来的说法是错误的。