【发布时间】:2018-06-29 06:45:17
【问题描述】:
所以我知道这不是推荐的技术(预分配更好),但我对这种计时行为非常好奇;我很好奇幕后可能会发生什么。
在我的脑海中,向数组添加元素可能会根据实现在内存中引发几种不同的合理行为:(1) 摊销,添加元素需要相同的时间,例如在链表中添加元素维护一个指向最后一个元素的指针,(2)它可能会不时花费大量时间来预分配足够的内存,例如,列表中当前元素数量的两倍(如 Java 数组),(3)某些东西比我想象的还要聪明。
MATLAB 似乎做了一些我不太满意的事情。成本似乎呈线性增长,偶尔会出现峰值。关于它可能在做什么的任何猜测(或明智的解释)?我对模拟进行了平均(我认为,这可能隐藏了一些有趣的模式)。
当您迭代地将一个元素添加到最初为空的列表的末尾时,就会发生这种情况。为什么是线性增长?这些看似周期性的峰值是否有一个很酷的原因?
我用来生成它的代码:
% for averaging over
num_averages = 100000;
% number of simulations
num_sims = 10000;
% the time it takes to add one more item, array
time_store = nan(num_sims, num_averages);
% averaging count
for i = 1:num_averages
% an array that grows with every loop
building_array = [];
for j = 1:num_sims
tic;
building_array = [building_array 1];
time_store(j, i) = toc;
end
end
plot(mean(time_store, 2)); hold all;
xlabel('Element num'); ylabel('Time');
【问题讨论】:
标签: arrays matlab performance memory