性能/低级含义“a(idx)= []”vs“a = a(~idx)”

时间:2016-10-19 15:22:56

标签: matlab performance low-level

正如标题所说,我想知道Matlab在这两个选项之间做了哪些不同的事情。为了论证,我们假设矩阵aidx足以处理内存问题,并定义:

  • 案例A: a(idx) = []
  • 案例B: a = a(~idx)

我的直觉说在案例A执行值重新分配,然后CPU需要处理从原始位置到新的有序位置的索引副本,同时跟踪同一矩阵的当前“头部”,以及以后修剪多余的记忆。

另一方面,案例B将对新分配的内存空间执行索引批量复制。

所以案例A可能比案例B慢,但内存要求更低。我是否正确?我不知道,在写完这篇文章之后,我觉得案例B需要首先执行案例A ......有什么想法吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

这很有趣,所以我决定采取措施:

我正在使用Matlab R2016a的Windows(64位)版本 CPU:Core i5-3550,频率为3.3GHz。 内存:8GB DDR3 1333(双通道)。

len = 100000000; %Number of elements in array (make it large enouth to be outsize of cache memory).
idx = zeros(len, 1, 'logical'); %Fill idx with ones.
idx(1:10:end) = 1; %Put 1 in every 10'th element of idx.

a = ones(len, 1); %Fill arrary a with ones.

disp('Measure: a(idx) = [];')
tic
a(idx) = [];
toc

a = ones(len, 1);
disp(' ');disp('Measure: a = a(~idx);')
tic
a = a(~idx);
toc

disp(' ');disp('Measure: not_idx = ~idx;')
tic
not_idx = ~idx;
toc

a = ones(len, 1);
disp(' ');disp('Measure: a = a(not_idx);')
tic
a = a(not_idx);
toc

结果:

Measure: a(idx) = [];
Elapsed time is 1.647617 seconds.

Measure: a = a(~idx);
Elapsed time is 0.732233 seconds.

Measure: not_idx = ~idx;
Elapsed time is 0.032649 seconds.

Measure: a = a(not_idx);
Elapsed time is 0.686351 seconds.

结论:

  1. a = a(~idx)a(idx) = []快两倍。
  2. a = a(~idx)的总时间等于not_idx = ~idx加上a = a(not_idx)的总和 Matlab可能单独计算~idx,因此消耗更多内存 内存消耗仅在物理RAM完全消耗时计量 我认为它可以忽略不计(~idx内存消耗是暂时的。)
  3. 两种解决方案都没有优化 我估计,完全优化的实现(在C中)要快10倍。