lamda संस्करण वास्तव में धीमी नहीं है। मैंने अभी एक त्वरित परीक्षण किया है और प्रतिनिधि संस्करण लगभग 30% तेज है।
यहाँ codez है:
class Blah {
public void DoStuff() {
}
}
List<Blah> blahs = new List<Blah>();
DateTime start = DateTime.Now;
for(int i = 0; i < 30000000; i++) {
blahs.Add(new Blah());
}
TimeSpan elapsed = (DateTime.Now - start);
Console.WriteLine(string.Format(System.Globalization.CultureInfo.CurrentCulture, "Allocation - {0:00}:{1:00}:{2:00}.{3:000}",
elapsed.Hours,
elapsed.Minutes,
elapsed.Seconds,
elapsed.Milliseconds));
start = DateTime.Now;
foreach(var bl in blahs) {
bl.DoStuff();
}
elapsed = (DateTime.Now - start);
Console.WriteLine(string.Format(System.Globalization.CultureInfo.CurrentCulture, "foreach - {0:00}:{1:00}:{2:00}.{3:000}",
elapsed.Hours,
elapsed.Minutes,
elapsed.Seconds,
elapsed.Milliseconds));
start = DateTime.Now;
blahs.ForEach(bl=>bl.DoStuff());
elapsed = (DateTime.Now - start);
Console.WriteLine(string.Format(System.Globalization.CultureInfo.CurrentCulture, "lambda - {0:00}:{1:00}:{2:00}.{3:000}",
elapsed.Hours,
elapsed.Minutes,
elapsed.Seconds,
elapsed.Milliseconds));
ठीक है, तो मैं और अधिक परीक्षण चलाने के लिए और यहाँ के परिणाम हैं गए हैं।
निष्पादन (forach, लैम्ब्डा या लैम्ब्डा, foreach) ज्यादा फर्क नहीं था के आदेश, लैम्ब्डा संस्करण अभी भी तेजी से किया गया था:
foreach - 00:00:00.561
lambda - 00:00:00.389
lambda - 00:00:00.317
foreach - 00:00:00.337
प्रदर्शन में अंतर बहुत कम है कक्षाओं के सरणी के लिए। यहाँ ब्ला [30000000] के लिए नंबर दिए गए हैं:
lambda - 00:00:00.317
foreach - 00:00:00.337
यहाँ एक ही परीक्षण है, लेकिन ब्ला एक struct किया जा रहा है:
Blah[] version
lambda - 00:00:00.676
foreach - 00:00:00.437
List version:
lambda - 00:00:00.461
foreach - 00:00:00.391
अनुकूलित का निर्माण, ब्ला एक सरणी का उपयोग कर एक struct है।
lambda - 00:00:00.426
foreach - 00:00:00.079
निष्कर्ष: foreach लैम्ब्डा बनाम के प्रदर्शन के लिए कोई कंबल जवाब नहीं है। जवाब है पर निर्भर करता है। HereList<T>
के लिए एक और वैज्ञानिक परीक्षण है। जहां तक मैं कह सकता हूं कि यह बहुत ही कुशल है। क्या तुम सच में प्रदर्शन उपयोग for(int i...
पाश के कारण चिंतित हैं। एक हजार ग्राहक रिकॉर्ड (उदाहरण) का एक संग्रह से अधिक पुनरावृत्ति के लिए यह वास्तव में बात यह सब ज्यादा नहीं है।
जहाँ तक कौन-सा संस्करण बीच तय उपयोग करने के लिए मैं नीचे स्थित के लिए लैम्ब्डा संस्करण जिस तरह से संभावित प्रदर्शन हिट कर दिया जाएगा।
निष्कर्ष # 2T[]
(जहां टी एक मान प्रकार है) फ़ोरैच लूप एक अनुकूलित अनुकूलित में इस परीक्षण के लिए लगभग 5 गुना तेज है। डीबग और रिलीज बिल्ड के बीच यह एकमात्र महत्वपूर्ण अंतर है। तो वहां आप जाते हैं, मूल्य प्रकारों के सरणी फोरैच का उपयोग करते हैं, बाकी सब कुछ - इससे कोई फर्क नहीं पड़ता।
स्रोत
2010-01-07 23:25:06
आप zombie.Groan करने के लिए कॉल भूल गया(); –
कोई निश्चित रूप से शिकायत करेगा कि यह व्यक्तिपरक है, लेकिन मुझे अभी भी जवाब देखने में दिलचस्पी है। मैं सोच रहा हूं, खुद, अगर इस मामले में 'foreach' के लिए अपनी प्राथमिकता के बावजूद, एक दूसरे को पसंद करने के लिए एक अनिवार्य कारण है। – JMD
मेरा मानना है कि संस्करण 2.0 लाश अब RunLikeHellTowardsSuvivors() का समर्थन करते हैं। –