20

在分析一个普通循环的速度有多快的过程中,我遇到了这个奇怪的现象。

对变量不做任何事情比对它做一些事情要慢得多。

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

这是我发现的:

     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?!

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


总而言之,我的问题是:

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

4

2 回答 2

11

JIT 加速器是一个移动的目标,试图猜测它加速了什么几乎是不可能的。在我的机器上使用 64 位 Linux R2013ax=xy=x花费相同的时间,但x速度要慢得多。如果我关闭 JIT 加速器feature accel off并花费更多时间,但x=x保持不变。实际上,在加速器关闭的情况下,所花费的时间与(稍慢) 相同。这表明 JIT 加速器在. 至于为什么 TMW 选择不加速,你的猜测和我的一样好。y=xxx=xxy=xxx

于 2013-09-19T15:52:30.447 回答
7

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

在比较不同的执行路径的性能时,您应该始终在函数内进行测试,就像在命令提示符下进行测试一样诱人且容易。

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

于 2013-12-25T14:01:28.247 回答