Всё ведь будет хорошо

понедельник, 28 апреля 2014 г.

Оптимизация

Немного про то, как можно увеличить скорость работы программ в Matlab. Хотя Matlab автоматически регулирует размеры векторов и матриц, оказывается, что лучше будет предварительно выделить матрицы. Такое предварительное распределение берет на себя расходы на выделение памяти только один раз, и это гарантирует, что матричные элементы будут храниться в смежных ячейках оперативной памяти (по столбцам).
Рассмотрим следующий код:

clear all;
nx = 50000;
dx = 5;
for i = 1:nx
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end

Это неоптимизированный код, так как размер массивов x и y будет увеличиваться с каждым проходом цикла, что будет увеличивать время работы. Так, его время работы составляет 1.97 сек. Но, мы знаем размеры наших массивов в большинстве случаев, поэтому можно заранее выделить под них память:

clear all;
nx = 50000;
dx = 5;
x = zeros(1,nx);
y = zeros(1,nx);
for i = 1:nx
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end

Время работы этого кода составляет 0.001999 сек., что намного быстрее.
Далее можно еще немного подоптимизировать его. Теперь вектора x (i), и y (i) тоже будут использовать преимущества векторизации.
Оптимальнее всего будет написать вот так:

clear all;
nx = 50000;
dx = 5;
x = zeros(1,nx);
y = x;
for i = 1:nx
x(i) = (i-1)*dx;
y(i) = sin(3*x(i));
end

Собственно, эта оптимизация не намного уменьшила время работы (0.00198 сек.)
Такие простые способы оптимизации кода помогут значитально уменьшить время работы приложений и сократить затраты памяти :)

Комментариев нет:

Отправить комментарий