为什么索引到数据集数组这么慢? dataset.subsref函数的峰值显示数据集的所有列都存储在单元格数组中。但是,单元索引比数据集索引快得多,后者只是索引到引擎盖下的单元阵列。我的猜测是,这与MATLAB OOP的一些开销有关。关于如何提高速度的任何想法?
%% Using R2011a, PCWIN64
feature accel off; % turn off JIT
dat = (1:1e6)';
dat2 = repmat({'abc'}, 1e6, 1);
celldat = {dat dat2};
ds = dataset(dat, dat2);
N = 1e2;
tic;
for j = 1:N
tmp = celldat{2};
end
toc;
tic;
for j = 1:N
tmp2 = ds.dat2; % 2.778sec spent on line 262 of dataset.subsref
end
toc;
feature accel on; % turn JIT back on
Elapsed time is 0.000165 seconds.
Elapsed time is 2.778995 seconds.
编辑:我更新了示例,更像是我看到的问题。在dataset.subsref的第262行花费了大量时间 - “b = a.data {varIndex};”。这对我来说很奇怪,因为它是一个简单的细胞解除引用。我想知道是否有一个OOP技巧可以让我在没有奇怪开销的情况下索引到“a.data”。
EDIT2:根据Andrew的建议,我已将此作为错误提交给MatWorks。如果我听到他们的任何消息,我会更新。
EDIT3: Matlab回复并表示他们现在已经意识到这个问题并将在未来版本中修复它。他们指出问题是针对单元阵列特有的,并尽可能避免使用它们。
答案 0 :(得分:3)
是的,您很可能会看到Matlab OOP方法调用的开销。与单元索引或其他语言的方法调用相比,它们很昂贵。你的.513872秒/ 1e4~ =每次通话51微秒,这是一些MCOS方法调用的近似成本;在我见过的机器上,每个约5-15微秒。所以看起来像subsref()调用本身的方法开销和其他方法和属性访问它依次调用。
有关详细信息和讨论,请参阅:Is MATLAB OOP slow or am I doing something wrong?
除了构建代码以最小化对“ds.dat”或其他方法的调用之外,我不知道如何更快地实现此目的。如果可能,在使用数据集时,调用“ds.dat”一次,将其保存在局部变量中并在那里使用它,然后将其推回到ds对象。
警告:我不知道“功能加速”是做什么的,或者它如何影响这些时间。
编辑:我把它扔进了像Richie建议的分析器中。在我的R2009b上,看起来大约一半的时间是方法调用开销,其余的在find(),strcmp()和subsref中的其他操作; subsref不会依次调用任何其他方法。
编辑2:修改后的示例显示了更高的时间。方法调用开销并未考虑所有这些。