मैंने छोटे परीक्षण कार्यक्रम लिखे हैं और आश्चर्यचकित क्यों हैं lock {}
समाधान लॉक-फ्री से तेज़ प्रदर्शन करता है लेकिन स्थिर चर पर [ThreadStatic]
विशेषता के साथ।.NET: थ्रेडस्टैटिक बनाम लॉक {}। ThreadStaticAttribute प्रदर्शन को कम क्यों करता है?
[ThreadStatic] टुकड़ा:
[ThreadStatic]
private static long ms_Acc;
public static void RunTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int one = 1;
for (int i = 0; i < 100 * 1000 * 1000; ++i) {
ms_Acc += one;
ms_Acc /= one;
}
stopwatch.Stop();
Console.WriteLine("Time taken: {0}", stopwatch.Elapsed.TotalSeconds);
}
ताला {} स्निपेट:
private static long ms_Acc;
private static object ms_Lock = new object();
public static void RunTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int one = 1;
for (int i = 0; i < 100 * 1000 * 1000; ++i) {
lock (ms_Lock) {
ms_Acc += one;
ms_Acc /= one;
}
}
stopwatch.Stop();
Console.WriteLine("Time taken: {0}", stopwatch.Elapsed.TotalSeconds);
}
मेरी मशीन पहला टुकड़ा पर 4.2 सेकंड लेता है; दूसरा - 3.2 सेकंड, जो 1 सेकंड तेज है। थ्रेडस्टैटिक और लॉक के बिना - 1.2 सेकंड।
मुझे उत्सुकता है कि [ThreadStatic]
इस सरल उदाहरण में विशेषता प्रोग्राम निष्पादन समय में इतनी सारी जोड़ती है?
अद्यतन: मुझे बहुत खेद है, लेकिन ये परिणाम DEBUG
निर्माण के लिए हैं। RELEASE
के लिए मुझे एक पूरी तरह से अलग संख्या मिली: (1.2; 2.4; 1.2)। DEBUG
संख्याओं के लिए (4.2; 3.2; 1.2) थे।
तो, RELEASE
बिल्ड के लिए कोई [ThreadStatic]
प्रदर्शन जुर्माना नहीं लगता है।
यही कारण है कि मैं अपने के quadcore पर दिखाई नहीं दे रहा है। अगर मैं किसी भी सीपीयू पर रिलीज संकलित करता हूं तो मुझे पहले स्निपेट के लिए 0.81 और दूसरे के लिए 4.5s मिलते हैं।थ्रेड सुरक्षा के बिना मामूली मामला 0.46 लेता है। – FuleSnabel
आप सही हैं। मैंने 'डीबग' से 'रिलीज' मोड में स्विच किया और आपके परिणामों के समान ही मिला। – Roman
यह समझने के लिए विघटित कोड को पढ़ने में मदद कर सकता है कि आपको आश्चर्यजनक परिणाम क्यों मिलते हैं। – FuleSnabel