При тестировании any()
коротких замыканий()! Я обнаружил следующее интересное поведение при предварительном распределении тестовой переменной:
test=zeros(1e7,1);
>> tic;any(test);toc
Elapsed time is 2.444690 seconds.
>> test(2)=1;
>> tic;any(test);toc
Elapsed time is 0.000034 seconds.
Однако, если я это сделаю:
test=ones(1e7,1);
test(1:end)=0;
tic;any(test);toc
Elapsed time is 0.642413 seconds.
>> test(2)=1;
>> tic;any(test);toc
Elapsed time is 0.000021 seconds.
Оказывается, это происходит потому, что переменная на самом деле не находится в ОЗУ, пока не будет полностью заполнена информацией, поэтому первый тест занимает больше времени, потому что ему необходимо выделить его. Я проверил это, посмотрев на память, используемую в диспетчере задач Windows.
Хотя это может иметь некоторый смысл (не инициализироваться до тех пор, пока это не понадобится), что меня немного сбило с толку, это следующий тест, где переменная заполняется в цикле for, и в какой-то момент выполнение останавливается.
test=zeros(1e7,1);
for ii=1:1e7
test(ii)=1;
if ii==1e7/2
pause
end
end
При проверке памяти, используемой MATLAB, я мог видеть, как при остановке она использовала только 50% требуемой памяти для test
(если она была заполнена). Это можно воспроизвести с разным количеством памяти довольно солидно.
Интересно, что следующее также не выделяет всю матрицу.
test=zeros(1e7,1);
test(end)=1;
Я знаю, что MATLAB не динамически выделяет и не увеличивает размер test
в цикле, поскольку это сделает очень медленные итерации конца (из-за высоких memcopys, которые понадобятся), и он также выделил бы весь массив в этом последнем тесте я предложил. Поэтому мой вопрос:
Что здесь происходит?
Кто-то предположил, что это может быть связано с виртуальной памятью против физической памяти и связано с тем, как ОС видит память. Не знаете, как это связано с первым испытанием, предложенным здесь. Любое дальнейшее объяснение было бы идеальным.
Выиграйте 10 x64, MATLAB 2017a