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

Выполнение чего-то быстрее, чем ничего не делать с переменной в цикле Matlab

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

Ничего не делать с переменной гораздо медленнее, чем что-то делать с ней.

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

Вот что я нашел:

     tic,for t= 1:1e6, x=x; end,toc %This runs very fast, about 0.07 sec
y=x; tic,for t= 1:1e6, y=x; end,toc %This runs fast, about 0.11 sec
     tic,for t= 1:1e6, x; end,toc   %This takes over half a second?!

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


Подводя итог, мой вопрос:

Что происходит, и я должен когда-либо беспокоиться об этом?

4b9b3361

Ответ 1

Я считаю, что вы запустили код в script или в командной строке. Если вы запустите его внутри функции, вы увидите, что все 3 варианта принимают почти ровно столько же времени. В командной строке Matlab не может использовать все свои доступные оптимизации, поэтому первые 2 варианта оптимизированы, а третий - нет. Это не очень важно, так как код Matlab обычно запускается внутри функций, где эффективность оптимизации максимизируется.

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

p.s. - В этом конкретном случае не виноват JIT, а интерпретатор другого (не-JIT) набора ускорений. Поведение vis-a-vis в командной строке против функции такое же, как в JIT, а именно, что многие оптимизации, доступные внутри функций, недоступны в CL. Вы можете увидеть это, увидев, что feature jit off не имеет никакого значения в отношении временной изменчивости (он делает варианты # 1 + # 2 медленнее, но они все же быстрее, чем вариант № 3), но когда вы запускаете feature accel off все различия между вариантами устранены, и все они работают на медленной скорости варианта № 3 (0,5 с в CL, 0,25 с в функции). JIT - это, по-видимому, подмножество ускорения, поэтому включение ускорения также отключает JIT (но не наоборот).

Ответ 2

Ускоритель JIT - движущаяся цель, и попытка угадать, что она ускоряет, почти невозможна. На моей машине 64-разрядная версия Linux R2013a x=x и y=x занимает одинаковое время, но x работает намного медленнее. Если я выключу ускоритель JIT feature accel off, то x=x и y=x потребуется больше времени, но x останется прежним. Фактически, когда ускоритель выключен, x=x принимает то же время, что и x (y=x немного медленнее). Это говорит о том, что ускоритель JIT не работает на x. Что касается того, почему TMW решил не ускорять x, ваша догадка так же хороша, как и моя.