मैं सोच रहा हूं कि लॉक कोड का एक टुकड़ा मेरे कोड को धीमा कर सकता है भले ही कोड कभी निष्पादित न हो। यहां एक उदाहरण दिया गया है:लॉक कोड के कारण मंदी से कैसे बचें?
public void Test_PerformanceUnit()
{
Stopwatch sw = new Stopwatch();
sw.Start();
Random r = new Random();
for (int i = 0; i < 10000; i++)
{
testRand(r);
}
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
}
public object testRand(Random r)
{
if (r.Next(1) > 10)
{
lock(this) {
return null;
}
}
return r;
}
यह कोड मेरी मशीन पर ~ 1300ms में चलता है। अगर हम लॉक ब्लॉक को हटाते हैं (लेकिन इसके शरीर को रखें), तो हमें 750 मिलीमीटर मिलेंगे। लगभग डबल, भले ही कोड कभी नहीं चलाया जाता है!
बेशक यह कोड कुछ भी नहीं करता है। मैंने इसे कक्षा में कुछ आलसी प्रारंभिक जोड़ते हुए देखा जहां कोड जांचता है कि ऑब्जेक्ट प्रारंभ होता है और यदि इसे प्रारंभ नहीं किया जाता है। समस्या यह है कि प्रारंभिक लॉक हो गया है और पहली कॉल के बाद भी सब कुछ धीमा हो जाता है।
मेरे प्रश्न हैं:
- हो रहा क्यों है?
- मंदी
जब तक आप 'लॉक' का उपयोग करने का इरादा नहीं रखते हैं - मैं वास्तव में इसके बारे में चिंता नहीं करता। – James
मुझे इसी तरह के परिणाम मिलते हैं, लेकिन एक टिक 100 * नैनो * -सेकंड है। दोनों रनों को ~ 0ms लेना चाहिए (यानी यदि आप 'sw.ElapseMilliseconds' प्रिंट करते हैं।) इस "मंदी" (~ 0.00006s) की संभावना इस तथ्य के कारण है कि' लॉक 'में' कोशिश/आखिरकार 'ब्लॉक शामिल है जो शायद जब विधि कहा जाता है तो सेटअप करें। लूप में 'testRand' की सामग्री डालने का प्रयास करें; आप उस बिंदु पर लगभग * नहीं * मंदी देखेंगे। – dlev
क्या आपने 'आक्रामक इनलाइन' के साथ विधि को चिह्नित करने का प्रयास किया है? शायद लॉकिंग कोड ने सामान्य इनलाइनिंग के लिए विधि को बहुत बड़ा बना दिया। आईएन कोड के आकार के आधार पर .net JITter एक बदबूदार ह्युरिस्टिक का उपयोग करके रेखांकित करता है। – CodesInChaos