2013-08-28 9 views
5

यह अवलोकन इतना महत्वपूर्ण नहीं है, क्योंकि लूप स्टेटमेंट पर समय प्रदर्शन बर्बाद हो सकता है, शायद लूपिंग से कहीं अधिक होगा। लेकिन वैसे भी, मैं इसे साझा करूँगा क्योंकि मैंने खोज की थी और इसके बारे में कोई विषय नहीं मिला। मुझे हमेशा यह इंप्रेशन था कि सरणी को आवंटित करने के लिए मैं लूप लूंगा, और उसके बाद लूप, सीधे उस पर लूपिंग से बेहतर होगा, और इसे जांचने का फैसला किया।लूपिंग स्टेटमेंट प्रदर्शन और लूपिंग स्टेटमेंट को पूर्व-आवंटित करना

disp('Pure for with column on statement:') 
tic 
for k=1:N 
end 
toc 

disp('Pure for with column declared before statement:') 
tic 
m=1:N; 
for k=m 
end 
toc 

लेकिन परिणाम मुझे मिल गया है::

Pure for with column on statement: 
Elapsed time is 0.003309 seconds. 
Pure for with column declared before statement: 
Elapsed time is 0.208744 seconds. 

नरक क्यों कि है कोड इस दो fors के बीच दक्षता तुलना करने के लिए हो सकता है? पूर्व आवंटन तेजी से नहीं होना चाहिए?

वास्तव में, matlab help for का कहना है:

लांग छोरों अधिक स्मृति हैं कुशल जब पेट अभिव्यक्ति प्रकट होता है के लिए बयान में के बाद से सूचकांक वेक्टर कभी नहीं बनाई गई है। क्योंकि यह वेक्टर आवंटित नहीं करता है और, क्योंकि उस की, तेजी से है

तो, बयान के लिए कम से मेरी अपेक्षाओं को स्तंभ अभिव्यक्ति का खंडन बेहतर है,।

मैं अन्य अवसरों कि मैं भी सोच सकता है कि तेजी से हो सकता है परीक्षण करने के लिए निम्न स्क्रिप्ट बनाया:

% For comparison: 
N=1000000; 

disp('Pure for loop on cell declared on statement:') 
tic 
for k=repmat({1},1,N) 
end 
toc 

disp('Pure for loop on cell declared before statement:') 
tic 
mcell=repmat({1},1,N); 
for k=mcell 
end 
toc 

disp('Pure for loop calculating length on statement:') 
tic 
for k=1:length(mcell) 
end 
toc 

disp('Pure for loop calculating length before statement:') 
tic 
lMcell = length(mcell); 
for k=1:lMcell 
end 
toc 

disp('Pure while loop using le:') 
% While comparison: 
tic 
k=1; 
while (k<=N) 
    k=k+1; 
end 
toc 

disp('Pure while loop using lt+1:') 
% While comparison: 
tic 
k=1; 
while (k<N+1) 
    k=k+1; 
end 
toc 


disp('Pure while loop using lt+1 pre allocated:') 
tic 
k=1; 
myComp = N+1; 
while (k<myComp) 
    k=k+1; 
end 
toc 

और समय कर रहे हैं:

Pure for loop on cell declared on statement: 
Elapsed time is 0.259250 seconds. 
Pure for loop on cell declared before statement: 
Elapsed time is 0.260368 seconds. 
Pure for loop calculating length on statement: 
Elapsed time is 0.012132 seconds. 
Pure for loop calculating length before statement: 
Elapsed time is 0.003027 seconds. 
Pure while loop using le: 
Elapsed time is 0.005679 seconds. 
Pure while loop using lt+1: 
Elapsed time is 0.006433 seconds. 
Pure while loop using lt+1 pre allocated: 
Elapsed time is 0.005664 seconds. 

निष्कर्ष:

  • आप कॉमा स्टेटमेंट्स पर लूप द्वारा थोड़ा सा प्रदर्शन प्राप्त कर सकते हैं, लेकिन यह वें पर खर्च किए गए समय की तुलना में नगण्य हो सकता है ई फॉर लूप।
  • कोशिकाओं के लिए अंतर नगण्य प्रतीत होता है।
  • लूप करने से पहले लंबाई को पूर्व-आवंटित करना बेहतर है।
  • वहीं वही दक्षता है जो बिना वेक्टर को प्री-आवंटित किए बिना है, जो
  • से पहले बताए गए अनुसार समझ में आता है, जबकि वक्तव्य से पहले निश्चित अभिव्यक्तियों की गणना करना बेहतर होता है।

लेकिन सवाल जो मैं जवाब नहीं दे सकता, सेल के बारे में क्या है, समय अंतर क्यों नहीं है? ओवरहेड मनाए गए से बहुत कम हो सकता है? या इसे कोशिकाओं को आवंटित करना है क्योंकि यह एक डबल प्रकार के रूप में मूल प्रकार नहीं है?

यदि आप जानते हैं कि इस विषय से संबंधित अन्य युक्तियां जोड़ने के लिए स्वतंत्र हैं।


बस समय जोड़ने feature('accel','off') निर्णायक के रूप में @ Magla के जवाब में कहा कि के परिणाम दिखाने के।

Pure for with column on statement: 
Elapsed time is 0.181592 seconds. 
Pure for with column declared before statement: 
Elapsed time is 0.180011 seconds. 
Pure for loop on cell declared on statement: 
Elapsed time is 0.242995 seconds. 
Pure for loop on cell declared before statement: 
Elapsed time is 0.228705 seconds. 
Pure for loop calculating length on statement: 
Elapsed time is 0.178931 seconds. 
Pure for loop calculating length before statement: 
Elapsed time is 0.178486 seconds. 
Pure while loop using le: 
Elapsed time is 1.138081 seconds. 
Pure while loop using lt+1: 
Elapsed time is 1.241420 seconds. 
Pure while loop using lt+1 pre allocated: 
Elapsed time is 1.162546 seconds. 

परिणाम अब क्षेत्र के रूप में उम्मीद ...

उत्तर

3

यह निष्कर्ष preallocating साथ है या नहीं लेना देना नहीं है: यह matlab जा रहा है सक्षम है या नहीं कई कोर के साथ बातें की गणना करने से संबंधित है। जब आप for कथन के भीतर कोलन ऑपरेटर डालते हैं, तो यह कई कोर (यानी मल्टीथ्रेडिंग) का उपयोग करने के लिए मैटलैब को बताता है।

यदि आप केवल feature('accel','off') के साथ एक कोर पर मैटलैब सेट करते हैं, तो doubles के साथ मनाया गया अंतर गायब हो जाता है। cells के बारे में, matlab multithreading का उपयोग नहीं करता है - इसलिए कोई अंतर नहीं देखा जा सकता है (जो भी accel की स्थिति है)।

for लूप बहुसंख्यक होता है जब एक कोलन का उपयोग किया जाता है, और केवल एक कोलन का उपयोग किया जाता है। समान अवधि वाले निम्नलिखित वैक्टर कई कोर लिप्त नहीं है:

  • for k = randperm(N)
  • for k = linspace(1,N,N)

लेकिन for k = 1:0.9999:N थ्रेड है।

एक स्पष्टीकरण इस matlab's support page पर पाया जा सकता है। यह बताता है कि बहु-कोर प्रोसेसिंग तब की जा सकती है जब "फ़ंक्शन द्वारा किए गए एल्गोरिदम में ऑपरेशंस आसानी से उन अनुभागों में विभाजित होते हैं जिन्हें समवर्ती रूप से निष्पादित किया जा सकता है।" एक कोलन ऑपरेटर के साथ, मैटलैब जानता है कि for विभाजन किया जा सकता है।

+0

अब यह समझ में आता है ... धन्यवाद! – Werner

+3

मैटलैब पहले से कैसे जान सकता था कि यह 'थ्रू' लूप के लिए बहु-थ्रेड के लिए सुरक्षित है? मेरी समझ यह है कि मैटलैब मूल रूप से 'fft', 'eig',' svd', और' sort' जैसे बहु-थ्रेड फ़ंक्शन करेगा, लेकिन लूप पर बहु-थ्रेडिंग प्राप्त करने के लिए समांतर प्रोसेसिंग टूलबॉक्स और 'parfor' निर्माण की आवश्यकता होती है ... क्या कोई आधिकारिक दस्तावेज है जो इस सुविधा पर चर्चा करता है? –

+0

@ कोलिन टी बॉवर्स - कृपया संपादन देखें। मेरी समझ के लिए; 'parfor' फ़ंक्शन का उपयोग 'के लिए' ब्लॉक की सामग्री को मल्टीथ्रेड करने के लिए किया जाता है। यहां, यह केवल दोहराया जाने वाला फ़ंक्शन कॉल है जिसका मूल्यांकन किया जाता है। – marsei

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