在Matlab循环中做某事比使用变量做任何事情都要快

Den*_*din 20 performance matlab

在分析平凡循环的速度的过程中,我遇到了这种奇怪的现象.

对变量不做任何事情要比使用变量做得慢得多.

当然这不是一个真正的问题,因为你不会经常感觉到编写什么都不做的代码的冲动,但这让我感到惊讶,所以我想知道是否有人理解发生的事情以及这在实际情况下是否会成为一个问题.

这是我发现的:

     tic,for t= 1:1e6, x=x; end,toc %This runs very fast, about 0.07 sec
y=x; tic,for t= 1:1e6, y=x; end,toc %This runs fast, about 0.11 sec
     tic,for t= 1:1e6, x; end,toc   %This takes over half a second?!
Run Code Online (Sandbox Code Playgroud)

我尝试在循环中添加一个简单的计算,以确保循环不会被优化掉,但这并没有改变结果.


总结一下,我的问题是:

发生了什么,我应该担心吗?

Str*_*Bad 11

JIT加速器是一个移动目标,试图猜测它加速的几乎是不可能的.在我的机器上64位Linux R2013a x=xy=x花费相同的时间,但x速度要慢得多.如果我把JIT加速不feature accel off那么x=xy=x需要更多的时间,但x保持不变.事实上,关闭加速器,x=x需要相同的时间x(y=x稍慢).这表明JIT加速器不起作用x.至于为什么TMW选择不加速x,你的猜测和我的一样好.

  • 他们可能认为没有人会疯狂到尝试它......直到丹尼斯出现! (5认同)
  • 真正让你大吃一惊的是试图猜测_当MATLAB可以加速.试试`tic,因为t = 1:1e6,x; Y = X; 结束,toc`它比x长约3倍!为什么它不再加速`y = x;`?如果在`y = x;`之后放置`x;`,则工作原理相同! (3认同)

Yai*_*man 7

我相信您在脚本或命令行中运行代码.如果您在一个函数中运行它,您将看到所有3个变体几乎花费相同的时间.在命令行中,Matlab无法使用所有可用的优化,因此前两个变体已经过优化,而第三个则没有.这并不是很令人担忧,因为Matlab代码通常在函数内运行,其中优化的有效性最大化.

在比较性能的不同执行路径时,您应该始终在函数内进行测试,因为它在命令提示符下进行测试很容易.

ps - 在这种特殊情况下,JIT不是故障,而是解释器的其他(非JIT)加速集.命令行与函数的行为与JIT相同,即函数中可用的许多优化在CL中不可用.您可以通过观察到feature jit off时间变化没有真正的差异来看到这一点(它使变体#1 +#2变慢,但它们仍然比变体#3更快) - 但是当你运行时feature accel off,变体之间的所有差异都被消除了所有这些都以变体#3的慢速运行(在CL中0.5秒,在函数中0.25秒).JIT显然是加速的子集,因此关闭加速也会关闭JIT(但反之亦然).