Разница в скорости MATLAB в идентичном коде - PullRequest
3 голосов
/ 22 июля 2011

У меня есть код MATLAB, с которым я работал.Есть три раздела, скажем, A, B и C. A и C могут меняться, B остается неизменным независимо.

То, что я сделал, было разделить A, B и C на отдельные файлы .m (не функциипросто скрипты).A просто создает набор переменных, B содержит логику, а C содержит графики для результатов.Я назову D файлом, в котором все, что я сделал, это линейное копирование / вставка всего содержимого A, B и C. сразу после друг друга.

Если я запускаю A, то B, затем C,итерация внутри B идет ОЧЕНЬ МЕДЛЕННО, около 15 секунд на итерацию.Если я запускаю D (только A, затем B, а затем вставляется C), он идет БЫСТРО, примерно 2 секунды на итерацию.

Учитывая, что MATLAB выполняет точно такой же код в точно таком же порядке, почему эти дватакое разное время выполнения?

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Я считаю, что у вас есть проблемы с памятью. Функции Matlab фактически получают свои входные переменные как указатели, но если вы измените данные, они станут копией. Так что, если A, B, C имеют большой ввод и вывод, и каждый из них изменяет небольшую часть некоторых данных, вы получаете много выделений памяти.

Например:

function Main()
 x = imread('peppers.png');
 for i=1:size(x,1)
     for j=1:size(x,2)
          x = ChangePixel(x,i,j);
     end
 end
 imshow(x);
end

function A = ChangePixel(A,i,j)
    A(i,j,:) = A(i,j,[3 2 1]);
end

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

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

1 голос
/ 22 июля 2011

Без воспроизводимого примера трудно сказать, что происходит.Хотя я могу рассказать вам, как искать себя.

Закройте и снова откройте MATLAB, чтобы все было свежо.(Или, по крайней мере, выполните close all hidden; clear classes; clc;.) Получаете ли вы такое же время, если вы звоните D до того, как позвоните A, B, C?Если вы не очистили свои переменные между ними, то MATLAB пришлось бы делать меньше распределения во второй раз.

Если время было одинаковым, вам нужно будет использовать профилировщик.(Щелкните «Рабочий стол» -> «Профилировщик».) Профилируйте каждый скрипт и запишите, какие строки были медленными.Они совпадают?Можете ли вы увидеть какие-либо шаблоны?Вы уверены, что один и тот же код действительно выполняется в обоих случаях?

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

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