2012-02-24 17 views
8

Tengo una función vectorizado que calcula la distancia a un gran conjunto de puntos. Para mejorar el rendimiento, estoy limitando el número de puntos seleccionando solo los necesarios. Entonces, en lugar de distanceToPoint(points.x) estoy usando distanceToPoint(points.x(IDX)). Cuando trazo el tiempo de cálculo necesario, puedo ver que cuando la parte indexada es más del% 75 de los datos, toma realmente más tiempo. ¿Qué puedo hacer para superar esto o impulsar la ganancia de rendimiento para decir% 85? enter image description hereMinimizar vector indexación overhead

EDIT: añado los resultados después de cambiar a la indexación lógica, obviamente mejor. Parece que hay una pérdida de rendimiento en el extremo inferior% 10 sin embargo (visible si ve las imágenes una encima de la otra) enter image description here

+0

Está su 'IDX' compone de números enteros que representan posiciones en su' points.x' o es una matriz lógica? – foglerit

+0

son números enteros de posición de regresar de un 'find (criterios)' función – zamazalotta

+5

en lugar de 'find', trate' IDX = == points.x Criteria' (o cualquier otra lógica definida 'IDX'). De esa forma, creará una matriz lógica, que en muchos casos dará como resultado una indexación más rápida. – foglerit

Respuesta

1

Estoy bastante seguro de lo que está pasando aquí es su esquema de indexación está tomando una pequeña cantidad de tiempo. No importa qué método elijas, llevará algo de tiempo, aunque hay mejores métodos. Lo lógico siempre es mejor que usar una declaración de búsqueda, pero quizás lo mejor sea simplemente usar el índice directamente. Aquí hay un código de muestra que usé para probar cosas, junto con los resultados. Tenga en cuenta que ejecuté esto usando 2010, creo que hay algún tipo de optimización que ocurre en los valores más altos, pero no estoy seguro de qué está pasando allí ... Está claro que la indexación directa parece un poco más rápida que usar una lógica , y debería ser mucho más rápido que algún tipo de declaración de hallazgo.

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