Производительность свопинга двух элементов в MATLAB

Я нашел ответ, это плохо, все еще была ошибка имени. Модель представления имела имя «ReceivedContainers», в то время как все остальное называлось «ReceptedContainers». Всегда внимательно проверяйте каждое правописание.

6
задан Andrew Shepherd 3 February 2009 в 00:47
поделиться

4 ответа

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

Моя теория состоит в том, что MATLAB использует внутренний подсчет ссылок / механизм копии на записи, и это заставляет всю матрицу быть скопированной внутренне, когда на него ссылаются с обеих сторон. (Это - предположение, потому что я не знаю внутренности MATLAB).

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

 swap1: 12.547 s
 swap2: 14.301 s
 swap3: 51.739 s

Вот код:

 methods (Access = public)
     function swap(self, i1, i2)
        swap1(self, i1, i2);
        swap2(self, i1, i2);
        swap3(self, i1, i2);
        self.SwapCount = self.SwapCount + 1;
    end
 end

 methods (Access = private)
    %
    % swap1: stores values in temporary doubles
    %         This has the best performance
    %
    function swap1(self, i1, i2)
        e1 = self.Data(i1);
        e2 = self.Data(i2);
        self.Data(i1) = e2;
        self.Data(i2) = e1;
    end

    %
    % swap2: stores values in a temporary matrix
    %        Marginally slower than swap1
    %
    function swap2(self, i1, i2)
        m = self.Data([i1, i2]);
        self.Data([i2, i1]) = m;
    end

    %
    % swap3: does not use variables for storage.
    %        This has the worst performance
    %
    function swap3(self, i1, i2)
        self.Data([i1, i2]) = self.Data([i2, i1]);
    end


end
6
ответ дан 8 December 2019 в 14:47
поделиться

В первом (медленном) подходе значение RHS является матрицей, таким образом, я думаю, что MATLAB подвергается потере производительности в создании новой матрицы для хранения этих двух элементов. Второй (быстрый) подход избегает этого путем работы непосредственно с элементами.

Проверьте статью "Techniques for Improving Performance" о MathWorks для способов улучшить Ваш код MATLAB.

4
ответ дан 8 December 2019 в 14:47
поделиться

Вы могли также сделать:

tmp = self.Data(i1);
self.Data(i1) = self.Data(i2);
self.Data(i2) = tmp;
2
ответ дан 8 December 2019 в 14:47
поделиться

Zach потенциально прав в этом, временная копия матрицы может быть сделана выполнить первую операцию, хотя я рисковал бы предположением, что существует некоторая внутренняя оптимизация в MATLAB, который пытается избежать этого. Это может быть функция версии MATLAB, который Вы используете. Я рассмотрел оба из Ваших дел в версии 7.1.0.246 (пара лет) и только видел различие в скорости приблизительно 2-2.5.

Возможно, что это может быть примером улучшения скорости тем, что называют "развертыванием цикла". При выполнении векторных операций на некотором уровне в рамках внутреннего кода существует вероятно ДЛЯ цикла, какие циклы по индексам Вы подкачиваете. Путем выполнения скалярных операций во втором примере Вы избегаете любых издержек от циклов. Отметьте эти два (несколько глупых) примера:

vec = [1 2 3 4];

%Example 1:
for i = 1:4,
  vec(i) = vec(i)+1;
end;

%Example 2:
vec(1) = vec(1)+1;
vec(2) = vec(2)+1;
vec(3) = vec(3)+1;
vec(4) = vec(4)+1;

По общему признанию было бы намного легче просто использовать векторные операции как:

vec = vec+1;

но примеры выше в целях иллюстрации. Когда я повторяю каждый пример многократно и время их, Пример 2 на самом деле несколько быстрее, чем Пример 1. Для маленького цикла с известным числом (в примере, всего 4), может на самом деле быть более эффективно воздержаться от цикла. Конечно, в этом конкретном примере, векторная операция, данная выше, является на самом деле самой быстрой.

Я обычно следую этому правилу: Попробуйте несколько разных вещей и выберите самое быстрое для Вашей определенной проблемы.

2
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: