【发布时间】:2020-10-19 16:26:32
【问题描述】:
设置 - 从以下测试代码看来,如果迭代次数超过六次,MATLAB JIT 似乎会优化 for 循环。
在第 6 次和第 7 次迭代之后,性能有了巨大的提升。在第 7 次迭代后,差异一直在波动(来自输出图)。
疑问 - 我无法理解 MATLAB JIT 在最少迭代次数后如何以及为何进行优化?这个最小数量也可以更改吗?
测试代码-
clearvars
clc
tic
N = 30;
a = NaN(1,N);
b = NaN(1,N);
for i=1:1:N
a(i)= toc;
end
(a.*1000000)' % time stamps in microseconds
diff(a.*1000000)' % difference in successive time stamps in microseconds
plot(diff(a.*1000000)')
输出 -(显示前 10 个值)
ans =
154.1000
196.4000
223.2000
249.1000
553.6000
760.9000
762.9000
763.3000
763.6000
764.0000
ans =
42.3000
26.8000
25.9000
304.5000
207.3000
2.0000
0.4000
0.3000
0.4000
0.3000
输出图 - 第 7 次迭代后的振荡:
【问题讨论】:
-
1) 我认为您测量错误,但我看不到这种效果 2) JIT 取决于代码,您的结果不适用于所有 for 循环。 3)你达到了测量的极限,我在我的机器上多次迭代得到 0us。
-
4) 如果你是对的,那么答案很可能是专有的......
-
1) 奇怪的是你得到 0us。不幸的是,我现在只有一台机器要测试。 2)为了规避 tic/toc 的测量限制,我尝试在 for 循环中添加一些虚拟计算并具有相同的输出。 3)我有另一个测试模拟代码,其中嵌套的 for 循环在第二次运行时显示优化(这与 MATLAB JIT 所做的一致)。 4)你说得对,它必须是专有的,MATLAB JIT文档也没有详细说明这一点
-
是的,你或多或少是对的。我得到不同的结果,但通常在第 5 次或第 6 次迭代之后,代码要快得多。可能是 JIT 的手动启发式阈值
-
鉴于循环迭代是预先确定的,JIT 不太可能在给定次数的迭代后“决定”做某事。在循环开始之前,已知它将运行 30 次。 JIT 可以在第一次运行之前决定是否有足够的迭代来实际编译。如果将代码放在函数中,那么整个代码将在函数开始之前编译,并且每次循环迭代应该同样快。 [续]
标签: matlab for-loop optimization iteration jit