Подтвердить что ты не робот

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

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

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

и

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

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

4b9b3361

Ответ 1

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

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

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

Обновление: Начиная с версии R2013b, timeit является частью основного MATLAB.


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

Ответ 2

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

>> 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

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

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

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

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

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

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

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

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

>> myresult = toc;

Ответ 3

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

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

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

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