Я верю, что могу перебирать вариации в таймингах между двумя методами, а также почему люди получают разные относительные скорости.
Перед тем, как версия Matlab 2008a (или версия рядом с этим выпуском), для циклов сильно пострадали в любом коде Matlab, потому что интерпретатор (слой между очень читаемым скриптом и реализация кода более низкого уровня) должен был бы повторно интерпретировать код каждый раз через цикл for.
С этого выпуска интерпретатор стал прогрессивно лучше, поэтому при запуске современной версии Matlab интерпретатор может посмотреть ваш код и сказать «Ах, я знаю, что он делает, позвольте мне оптимизировать его просто бит "и избегать попадания, которое в противном случае это потребовало бы путем переинтерпретации кода.
Я бы ожидал, что два способа выполнения умножения матрицы будут оцениваться за один и тот же промежуток времени, почему реализация цикла цикла работает быстрее из-за некоторых деталей в оптимизации интерпретатора, что мы, простые смертные, не знаем ,
Один широкий урок, который мы должны извлечь из этого, не все версии равны. Я работаю над несколькими случаями кровотечения, используя два дополнения Matlab, SimBiology и Parallel Computing Toolboxes, оба из которых (особенно если вы хотите, чтобы они работали вместе) зависят от скорости исполнения и время от времени другие проблемы стабильности. Таким образом, я сохраняю три последних выпуска Matlab, проверю, что получаю одинаковые ответы из каждой версии, и я иногда буду возвращаться к более ранней версии, если найду проблемы с некоторыми функциями. Это, вероятно, слишком много для большинства людей, но дает вам представление о различиях в версии.
Надеюсь, это поможет.
редактирует:
Чтобы уточнить, код векторизации по-прежнему важно. Но данный сценарий, как:
x_slow = zeros(1,1e5);
x_fast = zeros(1,1e5);
tic;
for i=1:1e5
x_slow(i) = log(i);
end
time_slow = toc; % evaluates for me in .0132 seconds
tic;
x_fast = log(1:1e5);
time_fast = toc; % evaluates for me in .0055 seconds
Несоответствие между time_slow и time_fast уменьшила в последние несколько версий, основанных на совершенствовании переводчика. Пример, который я видел, я считаю, был в 2000a против 2008b, но это зависит от моего воспоминания.
Есть что-то еще, что может произойти, на что обратились Оли и Юк. Существует часто разница между time_1 и time_2 в:
tic; x = log(1:1e5); time_1 = toc
tic; x = log(1:1e5); time_2 = toc
Таким образом, тест одного миллиона оценок против одной оценки является ценным, в зависимости от того, где в памяти х является (в кэше или нет).
Надеюсь, что это поможет снова.
В OSX, 2010b, я получаю среднее время 0.0001 для версии 1 и 0.0008 для второй версии. Другими словами, векторизованная версия примерно в 7 раз быстрее. – Jonas
Чтобы устранить некоторую изменчивость, может быть полезно сбросить случайный генератор перед началом второго запуска. Несмотря на это, я также считаю, что первый вариант в несколько раз быстрее. –