在分析琐碎循环的速度的过程中,我遇到了这种奇怪的现象。
对变量执行任何操作都比使用变量执行操作要慢得多。
当然这不是一个真正的问题,因为你不会经常感到编写什么也不做的代码的冲动,但这让我感到惊讶,所以我想知道是否有人理解发生的事情以及这在实际情况下是否会成为一个问题
这是我发现的:
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?!
我尝试在循环中添加一个简单的计算,以确保循环不会被优化掉,但这并没有改变结果。
总结一下,我的问题是:
发生了什么,我应该担心吗?
答案 0 :(得分:11)
JIT加速器是一个移动目标,试图猜测它加速的几乎是不可能的。在我的机器上,64位Linux R2013a x=x
和y=x
需要相同的时间,但x
要慢得多。如果我将JIT加速器关闭feature accel off
,那么x=x
和y=x
需要更多时间,但x
保持不变。事实上,关闭加速器,x=x
与x
的时间相同(y=x
稍微慢一点)。这表明JIT加速器不适用于x
。至于为什么TMW选择不加速x
,你的猜测和我的一样好。
答案 1 :(得分:7)
我相信您在脚本或命令行中运行代码。如果您在一个函数中运行它,您将看到所有3个变体几乎花费相同的时间。在命令行中,Matlab无法使用所有可用的优化,因此前两个变体已经过优化,而第三个则没有。这并不是很令人担忧,因为Matlab代码通常在函数内运行,其中优化的有效性最大化。
在比较性能的不同执行路径时,您应该始终在函数内进行测试,因为它很容易在命令提示符下进行测试。
P.S。 - 在这种特殊情况下,JIT不是故障,而是解释器的其他(非JIT)加速集。命令行与函数的行为与JIT相同,即函数中可用的许多优化在CL中不可用。您可以通过看到feature jit off
对时间变化没有真正的区别来看到这一点(它使变体#1 +#2变慢,但它们仍然比变体#3更快) - 但是当你运行{{1}时消除了变体之间的所有差异,并且它们全部以变体#3的慢速运行(CL中0.5秒,函数中0.25秒)。 JIT显然是accel的子集,因此关闭加速也会关闭JIT(但反之亦然)。