2012-02-24 12 views
8

मेरे पास एक वेक्टरीकृत फ़ंक्शन है जो बिंदुओं के एक बड़े सेट से दूरी की गणना करता है। प्रदर्शन में सुधार करने के लिए मैं केवल आवश्यक लोगों को चुनकर अंक की संख्या सीमित कर रहा हूं। तो distanceToPoint(points.x) के बजाय मैं distanceToPoint(points.x(IDX)) का उपयोग कर रहा हूं। जब मैं गणना गणना समय की साजिश करता हूं तो मैं देख सकता हूं कि जब अनुक्रमित भाग डेटा के 75% से अधिक है तो वास्तव में अधिक समय लगता है। इस पर काबू पाने के लिए मैं क्या कर सकता हूं, या प्रदर्शन लाभ को% 85 कहने के लिए धक्का दे सकता हूं? enter image description hereवेक्टर इंडेक्सिंग ओवरहेड को कम करें

संपादित करें: मैं तार्किक अनुक्रमण, स्पष्ट रूप से बेहतर करने के लिए स्विच करने के बाद परिणाम को जोड़ने कर रहा हूँ। ऐसा लगता है कम 10% छोर पर एक प्रदर्शन नुकसान लेकिन वहाँ है (दृश्य यदि आप एक दूसरे के ऊपर पर छवियों को देखने) enter image description here

+0

अपने 'IDX' अपने' points.x' में पदों का प्रतिनिधित्व पूर्णांकों से बना है या यह एक तार्किक सरणी है? – foglerit

+0

वे 'ढूंढें' के बजाय 'ढूंढें (मानदंड)' फ़ंक्शन – zamazalotta

+5

से वापस लौटे गए स्थिति पूर्णांक हैं, 'IDX = points.x == मानदंड' (या जो भी अन्य तर्क परिभाषित' आईडीएक्स') आज़माएं। इस तरह आप एक लॉजिकल सरणी तैयार करेंगे, जिसके परिणामस्वरूप कई मामलों में तेजी से अनुक्रमण – foglerit

उत्तर

1

मैं यकीन है कि यहाँ क्या हो रहा है अपने अनुक्रमण योजना एक छोटी राशि ले जा रहा है है समय की। इससे कोई फर्क नहीं पड़ता कि आप कौन सी विधि चुनते हैं, इसमें कुछ समय लगेगा, हालांकि बेहतर तरीके हैं। तार्किक एक खोज विवरण का उपयोग करने से हमेशा बेहतर होता है, लेकिन शायद सूचकांक का उपयोग केवल बेहतर है। यहां कुछ नमूना कोड दिए गए हैं जिनका उपयोग मैंने परिणामों के साथ-साथ सामानों का परीक्षण करने के लिए किया था। नोट, मैंने 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

संबंधित मुद्दे