Как сравнить процессы Matlab?

В поисках идеи, как избежать использования цикла в моем коде Matlab, я нашел следующие комментарии под одним вопросом на SE:

Утверждение "циклы медленны в Matlab" больше не соответствует действительности, так как Matlab...euhm, R2008a?

а также

Вы пытались сравнить цикл по сравнению с тем, что у вас уже есть? иногда это быстрее, чем векторизованный код...

Итак, я хотел бы спросить, есть ли обычно используемый способ проверки скорости процесса в Matlab? Может ли пользователь где-то увидеть, сколько времени занимает процесс, или единственный способ - продлить процессы на несколько минут, чтобы сравнить время между собой?

3 ответа

Решение

Лучший инструмент для тестирования производительности кода MATLAB - Стив Эддинс timeit функция, доступная здесь из центральной файловой биржи MATLAB.

Он решает многие тонкие проблемы, связанные с тестированием кода MATLAB для вас, такие как:

  • обеспечение того, чтобы компиляция JIT использовалась, оборачивая проверенный код в функцию
  • разогрев код
  • запускать код несколько раз и усреднять

Обновление: Начиная с выпуска R2013b, timeit является частью ядра MATLAB.


Обновление: Начиная с выпуска R2016a, MATLAB также включает платформу для тестирования производительности, которая обрабатывает вышеуказанные проблемы для вас аналогично timeit,

Вы можете использовать профилировщик, чтобы оценить, сколько времени занимают ваши функции и блоки кода внутри них.

>> profile on; % Starts the profiler
>> myfunctiontorun( ); % This can be a function, script or block of code
>> profile viewer; % Opens the viewer showing you how much time everything took

Зритель также очищает данные текущего профиля в следующий раз.

Имейте в виду, профиль имеет тенденцию немного замедлять выполнение, но я полагаю, что он делает это единообразно во всем.

Очевидно, что если ваша функция очень быстрая, вы можете обнаружить, что не получаете надежных результатов, поэтому, если вы можете запустить ее много раз или расширить вычисления, которые могли бы улучшить ситуацию.

Если вы тестируете действительно простой материал, вы также можете просто tic а также toc:

>> tic; % Start the timer
>> myfunctionname( );
>> toc; % End the timer and display elapsed time

Также, если вам нужно несколько таймеров, вы можете назначить их переменным:

>> mytimer = tic;
>> myfunctionname( );
>> toc(mytimer);

Наконец, если вы хотите сохранить прошедшее время вместо его отображения:

>> myresult = toc;

Я думаю, что я прав, утверждая, что многие из нас используют Matlab, оборачивая блок кода, который нас интересует, между tic а также toc, Кроме того, мы позаботимся о том, чтобы общее время составляло порядка 10 с (а не 1 с или 100 с), и повторяем его 3–5 раз, а также измеряем центральную тенденцию (например, среднее значение). и сделать наши выводы из этого.

Если фрагмент кода занимает меньше, чем, скажем, 10 с, то повторяйте его столько раз, сколько необходимо, чтобы ввести его в диапазон, стараясь избежать любого воздействия одной итерации на следующую. И если код, естественно, занимает 100 секунд или дольше, либо потратьте больше времени на тестирование, либо попробуйте его с искусственно небольшими входными данными для более быстрой работы.

По моему опыту, нет необходимости запускать программы в течение нескольких минут, чтобы получить данные в среднем времени выполнения с приемлемо низкой дисперсией. Если я запускаю программу 5 раз, и один (или два) из результатов сильно отличаются от среднего значения, я буду перезапускать ее.

Конечно, если код имеет какие-либо функции, которые делают его время выполнения недетерминированным, то это другой вопрос.

Другие вопросы по тегам