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

Почему Matlab работает быстрее после того, как script "разогрет"?

Я заметил, что при первом запуске script он занимает значительно больше времени, чем второй и третий раз. "Обогрев" упоминается в этом вопросе без объяснения причин. Мне интересно, почему код работает быстрее после того, как он "разогрет"? Я не clear all между вызовами, но входные параметры изменяются для каждого вызова функции. Кто-нибудь знает, почему это?

4b9b3361

Ответ 1

Одна из причин, по которой она запускается быстрее после первого раза, заключается в том, что многие вещи инициализируются один раз, а их результаты кэшируются и повторно используются в следующий раз. Например, в M-стороне переменные могут быть определены как persistent в функциях, которые могут быть заблокирован. Это также может происходить на MEX - side вещей.

Кроме того, многие зависимости загружаются после первого раза и остаются в памяти для повторного использования. Сюда входят M-функции, классы ООП, классы Java, MEX-функции и т.д. Это относится как к встроенным, так и к пользовательским.

Например, выпустите следующую команду до и после запуска script для первого запуска, а затем сравните:

[M,X,C] = inmem('-completenames')

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

Наконец, не будем забывать о роли ускорителя. Вместо того, чтобы интерпретировать M-код каждый раз при вызове функции, он компилируется в инструкции машинного кода во время выполнения. Компиляция JIT происходит только для первого вызова, поэтому в идеале эффективность запуска кода объекта в следующий раз будет преодолевать накладные расходы при повторной интерпретации программы каждый раз, когда она выполняется.

Ответ 2

интерпретируется. Если вы не разогреваете код, вы потеряете много времени из-за интерпретации вместо фактического алгоритма. Это может значительно исказить результаты таймингов.

Запуск кода пару раз позволит matlab, чтобы фактически скомпилировать соответствующие сегменты кода.

Ответ 3

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

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

Intel Turbo функция становится еще более напуганной: когда мощности и тепловые ограничения позволяют, процессор может работать быстрее, чем его устойчивая максимальная частота. Таким образом, первая ~ 20 секунд до 1 минуты вашего теста может работать быстрее, чем остальная часть, если вы не будете осторожны, чтобы контролировать эти факторы.

Ответ 4

Еще одна проблема, не связанная с Amro и Marc - это распределение памяти (pre).
Если ваш script не предварительно выделяет свою память, первый запуск будет очень медленным из-за выделения памяти. Как только он завершит свою первую итерацию, вся память будет выделена, поэтому последовательные вызовы script будут более эффективными.

Иллюстративный пример

for ii = 1:1000
    vec(ii) = ii; %// vec grows inside loop the first time this code is executed only
end