मैं इस कोड है (पूरे कोड महत्वपूर्ण नहीं है लेकिन this link पर देखा जा सकता):LINQ विधि का उपयोग करते समय सी # कंपाइलर निजी प्रदर्शन क्लास क्यों बनाता है() और मैं इससे कैसे बच सकता हूं?
internal static class PlayCardActionValidator
{
public static bool CanPlayCard(...)
{
// ...
var hasBigger =
playerCards.Any(
c => c.Suit == otherPlayerCard.Suit
&& c.GetValue() > otherPlayerCard.GetValue());
// ...
}
}
उदाहरण के लिए decompiler (ILSpy) में कोड खोलने के बाद मैं द्वारा नव निर्मित कक्षा <>c__DisplayClass0_0
के अस्तित्व पर ध्यान सी # संकलक:
यह नहीं करता है, तो इस कोड प्रणाली के प्रदर्शन के लिए महत्वपूर्ण नहीं था मेरे लिए एक समस्या होगी। इस विधि लाखों बार कहा जाता है और कचरा कलेक्टर इन <>c__DisplayClass0_0
उदाहरण हैं जिनमें प्रदर्शन को धीमा कर देती सफाई है:
का उपयोग करते समय मैं इस वर्ग (उसके उदाहरणों और उनके कचरा एकत्र करने) बनाने बच सकते हैं Any
विधि?
सी # कंपाइलर इस वर्ग को क्यों बनाता है और क्या Any()
का कोई विकल्प है जिसका उपयोग मैं कर सकता हूं?
यह कब्जा कर लिया चर के लिए एक सुरक्षित घर खोजने के लिए अपने कोड को फिर से लिखने की जरूरत है, otherPlayerCard और यहाँ ट्रम्पकार्ड। उन्हें स्थानीय चर से फ़ील्ड में बदलना ताकि उनका मूल्य विधि निकाय से परे संरक्षित किया जा सके। DisplayClass वह सुरक्षित घर है। –
हॉट पथ पर LINQ का उपयोग न करें, यह Roslyn codebase पर नीति है। – DaveShaw
मैं आमतौर पर सूक्ष्म अनुकूलन की सिफारिश करने से बचूंगा, लेकिन यदि यह कोड ** लाखों ** बार चलाया जा रहा है, तो इसे गति के लिए अनुकूलित करने के लिए इसे पुन: सक्रिय करना यहां समाधान होगा। LINQ धीमा है। –