2010-05-21 10 views
6

यह है:क्या लिंक तेज, धीमा या वही है?

Box boxToFind = AllBoxes.FirstOrDefault(box => box.BoxNumber == boxToMatchTo.BagNumber); 

इससे तेज या धीमा:

Box boxToFind ; 
foreach (Box box in AllBoxes) 
{ 
    if (box.BoxNumber == boxToMatchTo.BoxNumber) 
    { 
     boxToFind = box; 
    } 
} 

दोनों मुझे वह परिणाम दें जो मैं ढूंढ रहा हूं (boxToFind)। यह एक मोबाइल डिवाइस पर चलने जा रहा है जिसे मुझे ईमानदार प्रदर्शन करने की आवश्यकता है।

+2

आपकी पहली विधि संकलित नहीं होगी। जहां एक आईनेमरेबल लौटाता है। आखिरी के बराबर होने के लिए, आपको AllBoxes करना होगा। अंतिम (बॉक्स => ...) –

+0

अच्छा बिंदु। मैंने अपनी पहली विधि बदल दी। (हालांकि मैंने आखिरी बार उपयोग नहीं किया था, क्योंकि इसे "केवल" अद्वितीय मान होना चाहिए) – Vaccano

+0

आप दूसरी विधि संकलित करेंगे, लेकिन आपको मेल खाने वाला अंतिम बॉक्स देगा। एक ब्रेक रखो; जब आप बाहर निकलेंगे। – Rubys

उत्तर

8

यह वही के बारे में, नहीं Where होना चाहिए सिवाय इसके कि आप First फोन (या, अपने कोड, Last मैच के लिए) की जरूरत है,।
कॉलिंग Where आपको मेल खाने वाले आइटमों का एक सेट देगा (एक IEnumerable<Box>); आप केवल एक मिलान आइटम चाहते हैं।

सामान्य रूप से, LINQ का उपयोग करते समय, आपको स्थगित निष्पादन के बारे में पता होना चाहिए। आपके विशेष मामले में, यह अप्रासंगिक है, क्योंकि आपको एक ही आइटम मिल रहा है।

+1

अपवादों से बचने के लिए FirstOrDefault – hunter

+11

@hunter: जब तक वह अपवाद नहीं चाहता। – SLaks

+0

@SLaks या जानता है कि एक उपयुक्त तत्व हमेशा मौजूद है। – Thomas

2

यदि माइक्रो-ऑप्टिमाइज़ेशन आपकी बात है, तो LINQ खराब प्रदर्शन करता है, this is just one article, आपको कई अन्य पोस्ट मिल सकती हैं।

+8

** प्री-परिपक्व अनुकूलन सभी बुराइयों की जड़ है। ** यह उनके लिए प्रासंगिक होने की संभावना नहीं है। – SLaks

+0

पता नहीं है कि क्या आपने उस लेख के लिए टिप्पणियां पढ़ी हैं, लेकिन समस्या का बड़ा हिस्सा पुनरावृत्ति नहीं था, लेकिन उसके मूल कोड में अंतर्निहित कलाकार था। एंडर्स हेजल्सबर्ग ने बताया कि एक प्रश्न जिसमें प्रति-पुनरावृत्ति कास्ट ऑपरेशंस शामिल नहीं था, वह लूप के लिए काफी करीब था। –

0

सबसे तेज़ तब होता है जब आप लूप के लिए उपयोग कर रहे होते हैं। लेकिन अंतर इतना छोटा है कि आप इसे अनदेखा कर रहे हैं। यह केवल तभी मायने रखता है यदि आप रीयल-टाइम एप्लिकेशन बना रहे हैं लेकिन फिर उन अनुप्रयोगों के लिए शायद सी # सबसे अच्छा विकल्प नहीं है!

8

अंतर तब तक महत्वपूर्ण नहीं है जब तक कि आपने यह विशेष लूप प्रोफाइलिंग के माध्यम से प्रदर्शन बाधा के रूप में नहीं पहचाना है।

यदि प्रोफाइलिंग को यह समस्या हो रही है, तो आप वैकल्पिक संग्रहण में देखना चाहेंगे। डेटा को एक शब्दकोश में संग्रहीत करें जो सरणी के माध्यम से लूपिंग की तुलना में तेज़ लुकअप प्रदान करता है।

+0

एक शब्दकोश एक सरणी से तेज लुकअप प्रदान करता है? यह निश्चित रूप से नरक के रूप में नहीं है। जब भी आप किसी तत्व को एक्सेस करते हैं तो अतिरिक्त गणना के साथ शब्दकोशों को सरणी द्वारा समर्थित किया जाता है। इसलिए, एक शब्दकोश के लिए एक पुनरावृत्ति में एक सरणी से तेज़ होना असंभव है। – Rubys

+5

@Rubys - शब्दकोश लुकअप ओ (1) हैं, एक सरणी के माध्यम से पुनरावृत्ति ओ (एन) है इसलिए शब्दकोश लुकअप एक बड़े पर्याप्त संग्रह (एक समझदार हैश फ़ंक्शन मानते हुए) के लिए तेज़ हैं। – Lee

+0

@Rubys, शब्दकोश का उपयोग सरणी की सरणी से किया जाता है। एक हैशकोड का उपयोग पहली सरणी में सटीक रूप से पहचानने के लिए किया जाता है। कोई लूप नहीं है, बस एक साधारण गणितीय गणना है। यह आपको दूसरी सरणी देता है, जिसे अक्सर बाल्टी कहा जाता है। फिर सटीक आइटम खोजने के लिए कोड बाल्टी के माध्यम से loops।एक अच्छा संग्रह आकार और हैश कोड का परिणाम बाल्टी में होगा जिसमें केवल कुछ आइटम होंगे। अंत परिणाम यह है कि शब्दकोश सरणी लूप से काफी तेज़ है। –

1

माइक्रो अनुकूलन आपको मार देगा।
सबसे पहले, पूरी कक्षा को समाप्त करें, फिर, यदि आपके पास प्रदर्शन समस्याएं हैं, तो एक प्रोफाइलर चलाएं और एप्लिकेशन के हॉटस्पॉट की जांच करें।
सुनिश्चित करें कि आप सबसे अच्छे एल्गोरिदम का उपयोग कर रहे हैं, फिर इस तरह के माइक्रो ऑप्टिमाइज़ेशन पर जाएं।

मामले में आप पहले से ही किया था:
धीरे -> फास्ट
LINQ < foreach < < के लिए असुरक्षित के लिए (अंतिम विकल्प अनुशंसित नहीं है)।
एब्स्ट्रैक्शन आपके कोड को धीमा कर देगा, 9 5% समय।

0

यदि ऑलबॉक्स एक IQueryable है, तो यह लूप से तेज़ हो सकता है, क्योंकि पूछताछ के पास कहां ऑपरेशन (उदाहरण के लिए अनुक्रमित पहुंच) का एक अनुकूलित कार्यान्वयन हो सकता है।

+0

@ सैम: IQueryable IENumerable विरासत में मिलता है, इसलिए एक foreach पाश – Rauhotz

-2

LINQ बनाम लूप - एक प्रदर्शन परीक्षण

LINQ: 00:00:04.1052060, avg. 00:00:00.0041052 
Loop: 00:00:00.0790965, avg. 00:00:00.0000790 

संदर्भ:

http://ox.no/posts/linq-vs-loop-a-performance-test

http://www.schnieds.com/2009/03/linq-vs-foreach-vs-for-loop-performance.html

+1

काम करता है यह प्रश्न एक विशिष्ट क्वेरी के बारे में पूछता है, आपका उत्तर पूरी तरह से अलग है। – svick

0

LINQ बिल्कुल 100% धीमी है

इस बात पर निर्भर करता है कि आप अपने कार्यक्रम में क्या करने की कोशिश कर रहे हैं, लेकिन अधिकांश भाग के लिए यह निश्चित रूप से है कि मैं LAZY प्रोग्रामर कोड कहूंगा ...

यदि आप प्रदर्शन कर रहे हैं तो आप अनिवार्य रूप से "स्टॉल-आउट" जा रहे हैं कोई जटिल प्रश्न, इत्यादि आदि ... उन प्रकार के कार्यों/विधियों के लिए कुल pos- बस इसका उपयोग न करें। यदि आप इसे कठिन/लंबा रास्ता तय करते हैं तो आप लंबे समय तक ज्यादा खुश रहेंगे ... और प्रदर्शन एक अलग दुनिया होगा।

नोट:

मैं निश्चित रूप से गति/तुल्यकालन कार्य/गणना के लिए बनाया गया है (यानी एचएफटी व्यापार &/या आई-0-मैं शुरुआत के लिए व्यापार पर) किसी भी कार्यक्रम के लिए LINQ की सिफारिश नहीं होगा।

परीक्षण:

यह एक "LINQ" बनाम < 1 मिलीसेकंड में शामिल होने के पूरा करने के लिए लगभग 10 सेकंड लिया।

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