为什么索引到数据集数组这么慢?进入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 - “b = a.data {varIndex};”的第262行花费了大量时间。这对我来说很奇怪,因为它是一个简单的细胞去引用。我想知道是否有一个OOP技巧可以让我在没有奇怪开销的情况下索引“a.data”。
编辑2:根据安德鲁的建议,我已经将此作为一个错误提交给MatWorks。如果我从他们那里听到任何信息,将更新
EDIT3: Matlab的回应,并表示,他们意识到了这个问题现在将修复它在未来的版本。他们指出,这个问题是针对单元阵列的,如果可能的话尽量避免它们。
它在MATLAB profiler下看起来像什么? –
+1 Richie的评论是任何Matlab性能问题的最佳答案。 –
超过90%的时间花费在dataset.subsref的第262行上,这是奇怪的b/c,它是一个简单的单元格取消引用。不幸的是,我给出的例子太简单了,无法显示。我会更新一个更现实的例子。 –