Я вижу гораздо меньшую разницу, чем вы. B
- это совершенно другой результат, чем A
или C
, поэтому я проигнорирую эту часть. C2
и C3
Я ничего не могу сказать, потому что для них нет кода, я не знаю, что они делают.
С N=1e3
я получаю 2,0 мс для A
и 3,3 мс для C
. Массив настолько мал, что создание четырех промежуточных копий не является большой проблемой. Накладные расходы на l oop, хотя и небольшие, заметны (MATLAB 15 лет go видел бы, что l oop был бы в 100 раз медленнее!). Отметим также, что, как Марта Г. предложила , суммирование для A
распараллелено, MATLAB может использовать инструкции SIMD и / или несколько ядер для выполнения этих дополнений. Это ускорение частично компенсирует стоимость создания копий данных.
При N=1e4
я получаю 0,62 с для A
и 0,37 с для C
. Здесь массив настолько велик, что накладные расходы на создание копий начинают действительно показываться. Для еще больших массивов разница во времени будет намного больше. Обратите внимание, что время вычисления C
близко к 100 раз больше, чем в первом случае, и что массив X
в 100 раз больше, чем в первом случае. Поэтому пришло время вычислить A
, которое не подходило для размера массива.
Итак, когда вы решаете, как реализовать что-то, попробуйте разные варианты и всегда рассчитывайте их с realisti c размеры массивов.
Примечание для синхронизации:
Всегда запускайте синхронизацию, используя функции и timeit
. Вызов l oop или функции, для выполнения которой требуются миллисекунды, не может быть правильно рассчитан с помощью tic
/ toc
. Только то, что для запуска занимает около секунды или более, может быть рассчитано так, как вы это сделали. Но поместите код в функцию, чтобы можно было применить JIT. Скрипты JIT'ы в самых последних версиях MATLAB, но не в более ранних версиях, и поэтому tic
/ toc
всегда должны появляться внутри функции.
Так может выглядеть код синхронизации :
X = rand(1e4);
A = methodA(X);
C = methodC(X);
assert(all(all(abs(A-C)<1e-14)))
timeit(@()methodA(X))
timeit(@()methodC(X))
function A = methodA(X)
N = size(X,1);
i=1:2:N-1;
j=1:2:N-1;
A = (X(j,i) + X(j,i+1) + X(j+1,i) + X(j+1,i+1)) / 4;
end
function C = methodC(X)
N = size(X,1);
C = zeros(N/2);
for i=1:N/2
si = i*2-1;
for j=1:N/2
sj = j*2-1;
C(j,i) = (X(sj,si) + X(sj+1,si) + X(sj,si+1) + X(sj+1,si+1)) / 4;
end
end
end