MATLAB迭代地添加数组元素:时间行为

时间:2018-01-19 23:37:40

标签: arrays matlab performance memory

所以我知道这不是推荐的技术(preallocating更好),但我对这个时间行为非常好奇;我很好奇底下会发生什么。

在我的脑海中,向数组中添加一个元素可能会在内存中产生几个不同的合理行为,具体取决于实现:(1)分摊,在链接列表中添加元素需要相同的时间维护一个指向最后一个元素的指针,(2)它可能需要花费很长一段时间,然后预先分配足够的内存,比如列表中当前元素的两倍(如Java数组),(3)比我想象的更聪明。

MATLAB似乎做了一些我不太满意的事情。偶尔出现峰值,成本似乎呈线性增长。它可能在做什么的任何猜测(或智能解释)?我平均模拟(我提交,可能会隐藏一些有趣的模式)。

当您将一个元素迭代地添加到最初为空的列表的末尾时会发生这种情况。为什么线性增加?那些看似周期性的尖峰是否有一个很酷的原因?

iterative time behavior

我用来生成它的代码:

#Article{
   display:inline-block;
   margin-bottom:5%;
   margin-left:20%;

}

#Article2{
   display:inline-block;
   margin-bottom:5%;
   margin-left:20%;

}

1 个答案:

答案 0 :(得分:5)

这真的很有趣!在非常规则的交织处存在峰值,并且曲线之间或多或少是平坦的。在每个峰值之后,该线上升了一点。整齐!我认为这与缓存行有关。您正在测量复制阵列的成本,这可能与读取和写入缓存行的成本有关。

如果替换

building_array = [building_array 1];

building_array(end+1) = 1;

然后你不会在每次迭代循环中复制数据,但实际上是将一个元素附加到数组中。通过这种变化,我获得了一条大致平坦的线,峰值以对数增加的距离(以及对数增加的高度),这与需要时加倍阵列大小的常识实现一致:

enter image description here

还有一些解释:building_array = [building_array 1]创建一个新数组,一个大于building_array的元素,并将building_array1复制到其中。然后将其分配给building_array。似乎MATLAB的JIT尚未针对此代码模式进行优化!