Минимизировать затраты на векторную индексацию - PullRequest
8 голосов
/ 24 февраля 2012

У меня есть векторизованная функция, которая вычисляет расстояние до большого набора точек. Для повышения производительности я ограничиваю количество баллов, выбирая только нужные. Поэтому вместо distanceToPoint(points.x) я использую distanceToPoint(points.x(IDX)). Когда я строю график необходимого времени вычислений, я вижу, что, когда индексированная часть составляет более 75% данных, на самом деле это занимает больше времени. Что я могу сделать, чтобы преодолеть это, или подтолкнуть увеличение производительности, чтобы сказать% 85? enter image description here

РЕДАКТИРОВАТЬ: Я добавляю результаты после перехода на логическое индексирование, очевидно, лучше. Однако на нижнем конце% 10 наблюдается потеря производительности (это видно, если смотреть изображения друг на друга) enter image description here

1 Ответ

1 голос
/ 21 марта 2012

Я почти уверен, что здесь происходит, потому что ваша схема индексации занимает немного времени. Независимо от того, какой метод вы выберете, это займет некоторое время, хотя есть и лучшие методы. Логика всегда лучше, чем использование оператора find, но, возможно, еще лучше просто использовать индекс напрямую. Вот пример кода, который я использовал для тестирования, вместе с результатами. Обратите внимание, я выполнил это с использованием 2010, я думаю, что есть некоторая оптимизация, которая происходит в более высоких значениях, но я не уверен, что именно там происходит ... Ясно, что прямая индексация кажется немного быстрее, чем с использованием логической и должен быть намного быстрее, чем какой-либо оператор поиска.

function time_test
time_full_test=zeros(1e3,1);
time_part_test=zeros(1e3,1);
time_direct_indexing_full=zeros(1e3,1);
time_direct_indexing_part=zeros(1e3,1);
data=rand(1e5,1);

for i=1:1e3
    time_full_test(i)=complex_stuff(data);
    time_part_test(i)=complex_stuff(data,i*100);
    time_direct_indexing_full(i)=complex_stuff2(data);
    time_direct_indexing_part(i)=complex_stuff2(data,i*100);
end
figure;plot(time_full_test);hold all;plot(time_part_test);plot(time_direct_indexing_full);plot(time_direct_indexing_part)
legend('Full Time Logic','Part Time Logic','Full Time Direct','Part Time Direct')

function time=complex_stuff(input,max_val)
tic
if ~exist('max_val','var')
    mask=true(size(input));
else
    mask=false(size(input));
    mask(1:max_val)=true;
end
sin(input(mask).^2/4356.342).^63/345;
time=toc;

function time=complex_stuff2(input,max_val)
tic
if ~exist('max_val','var')
    max_val=length(input);
end
sin(input(1:max_val).^2/4356.342).^63/345;
time=toc;

enter image description here

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