MATLAB Cpu time = 0 выпуск - PullRequest
1 голос
/ 22 июня 2019

Я написал функцию в MATLAB. В рамках этой функции я использую:

t = cputime;
...
time = cputime-t;

Где у меня есть некоторые операции в точках. Всякий раз, когда я не вызываю функцию и вместо этого запускаю код в функции вручную, у меня всегда есть время = 0,15 и т. Д.

Однако в другом скрипте я вызываю эту же функцию. Во время первого звонка он снова дает мне время = 0,15. НО, если я очищаю рабочее пространство и снова вызываю функцию, у меня время = 0. Просто 0, без десятичных дробей. Я не знаю почему, потому что функция работает и дает мне то, что я хочу. Если я вместо этого запускаю код в функции много раз, у меня никогда не будет времени = 0.

Какова возможная проблема? Почему вызов функции из сценария более одного раза равен 0 секундам, даже если рабочее пространство очищено?

1 Ответ

3 голосов
/ 22 июня 2019

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

timeit сначала «прогревает» систему, затем несколько раз запускает код для получения точной оценки времени, которое требуется.

Использование cputimeили tic / toc приводит к неточным измерениям, когда выполняемый код короткий.Разрешение часов просто недостаточно для его правильного измерения (именно поэтому вы можете видеть 0 вместо очень маленького числа), и на измерение могут влиять другие элементы, происходящие на вашем компьютере одновременно.

Наконец, MATLAB использует JIT (Just In Time) компилятор.Код внутри функции анализируется и компилируется один раз при первом ее выполнении.В последующие времена просто повторно используйте скомпилированный код, поэтому выполняйте его намного быстрее.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...