Это связано с размером числа, для которого вычисляется мощность, а не с размером контейнера.
Если вы используете случайные числа, для изменения размера контейнера, не наблюдается скачка времени:
x = 450:1550;
y = zeros(numel(x), 1);
X = rand(1, 10000);
for i = 1:length(x)
f = @() 2 .^ X(1:x(i));
y(i) = timeit(f);
end
figure()
plot(x, y)
Поэтому проблема должна быть в вычислениях для очень больших чисел.
Сначала я подумал, что это может быть связано с переполнением, но переполнение происходит в 2 ^ 1024 == inf
в соответствии с стандартами IEEE , которым следует MATLAB, и я подумал, что для inf
это было бы намного быстрее, чем вычисление числа для реального.
Это поддерживается следующим тестом, в котором размер массива поддерживается постоянным:
x = 450:1550;
y = zeros(numel(x), 1);
X = rand(1, 10000);
for i = 1:length(x)
f = @() 2 .^ (ones(1, 500) * x(i));
y(i) = timeit(f);
end
figure()
plot(x, y)
Почему именно это может иметь отношение к вашей настройке, когда 2 ^ 512
вместо 2 ^ 1024
, я не очень понимаю.
(Обратите внимание, что я использовал 2 .^ ...
вместо power(2, ...)
, но результаты те же.)
Кроме того, выполнение кода @ CrisLuengo в моей системе на самом деле не воспроизводит скачок.
x = 500:540;
t = zeros(size(x));
for ii = 1:numel(x)
%m = 1:x(ii);
m = 500*rand(1,x(ii));
t(ii) = timeit(@()power(2,m));
end
plot(x,t)
все имеющиеся на данный момент свидетельства указывают на то, что всплеск связан с задержкой / прогревом JIT.