मैं लॉगिंग के लिए log4net और System.Diagnostics.Trace
का उपयोग करने के बीच अंतर की जांच कर रहा हूं, और मैं देखे गए प्रदर्शन अंतरों के बारे में उत्सुक हूं।क्या लॉग 4नेट सिस्टम से बहुत धीमा है। डायग्नोस्टिक्स। ट्रेस?
मैं एक परीक्षण आवेदन कई परिदृश्य में दोनों प्रवेश तरीकों के प्रदर्शन की तुलना करने के लिए बनाया है, और मैं खोजने रहा है कि log4net Trace
वर्ग की तुलना में काफी धीमी है। उदाहरण के लिए, एक परिदृश्य में जहां मैं कोई स्ट्रिंग स्वरूपण के साथ 1,000 संदेश लॉग करता हूं, 1,000 परीक्षणों से log4net का औसत निष्पादन समय 9.00ms है। Trace
1.13ms के माध्य के साथ निष्पादित करता है। लॉग 4नेट निष्पादन समय में मेरे कई परीक्षण मामलों में अपेक्षाकृत बड़ी मात्रा में भिन्नता है; बाहरी लंबे निष्पादन की आवधिक प्रकृति जीसी हस्तक्षेप का सुझाव देती है। सीएलआर प्रोफाइलर के साथ घूमते हुए पुष्टि करता है कि log4net.Core.LoggingEvent
ऑब्जेक्ट्स के टन के लिए बड़ी मात्रा में संग्रह होते हैं (निष्पक्ष होने के लिए, ऐसा लगता है कि Trace
Char[]
ऑब्जेक्ट्स का एक टन भी उत्पन्न करता है, लेकिन यह बड़े भिन्नता को प्रदर्शित नहीं करता है log4net करता है।)
एक बात जो मैं ध्यान में रख रहा हूं वह यह है कि भले ही log4net Trace
से लगभग 9 गुना धीमा लगता है, अंतर 1000 से अधिक पुनरावृत्तियों से 8ms है; यह वास्तव में एक महत्वपूर्ण प्रदर्शन नाली नहीं है। फिर भी, मेरे कुछ अपेक्षित उपयोग मामलों में कॉलिंग विधियां हो सकती हैं जो सैकड़ों हजारों बार लॉगिंग कर रही हैं, और ये संख्याएं मेरी फास्ट मशीन से हैं। एक धीमी मशीन पर हमारे उपयोगकर्ताओं की कॉन्फ़िगरेशन की अधिक विशिष्टता अंतर 170 मिमी से 11ms है जो एक छोटा और अधिक खतरनाक है।
क्या यह प्रदर्शन log4net के विशिष्ट है, या क्या ऐसे कुछ गॉथ हैं जो लॉग 4नेट के प्रदर्शन को काफी बढ़ा सकते हैं?
(नोट: मुझे पता है कि स्ट्रिंग स्वरूपण निष्पादन समय को बदल सकता है; मैं सेब से सेब की तुलना करने की कोशिश कर रहा हूं और मेरे पास प्रारूपण के साथ कोई स्वरूपण और परीक्षण मामलों के साथ परीक्षण के मामले हैं; log4net स्ट्रिंग स्वरूपण के अनुपात में आनुपातिक रूप से धीमा रहता है या प्रयोग किया जाता है नहीं)
कहानी अब तक:।
- रॉबर्ट गोल्ड सवाल का सर्वश्रेष्ठ उत्तर है; मैं मुख्य रूप से उत्सुक था अगर यह देखने के लिए सामान्य था कि log4net
Trace
वर्ग से बहुत धीमा प्रदर्शन करता है। - एलेक्स श्नाइडर का जवाब दिलचस्प जानकारी है लेकिन वास्तव में प्रश्न के दायरे में नहीं आता है। इस लॉगिंग को शुरू करने के इरादे का आधा हिस्सा लाइव सिस्टम पर तार्किक और प्रदर्शन दोनों समस्याओं को डीबग करने में सहायता करना है; हमारे ग्राहकों ने हमारे उत्पादों को कई विदेशी परिदृश्यों में रखा है जो बिना महंगे और बड़े पैमाने पर हार्डवेयर कॉन्फ़िगरेशन के पुन: पेश करना मुश्किल होता है। मेरी मुख्य चिंता यह है कि "लॉगिंग नहीं" और "लॉगिंग" के बीच एक बड़ा समय अंतर सिस्टम को इस तरह प्रभावित कर सकता है कि बग नहीं होते हैं। अंत में, प्रदर्शन में कमी का स्तर बड़ा है लेकिन परिमाण छोटा है, इसलिए मुझे उम्मीद है कि यह कोई समस्या नहीं होगी।
System.Diagnostics.Trace DebugListeners संग्रह का हिस्सा के रूप में संचालित है और इस तरह धीरे श्रोता के रूप में के रूप में तेजी से जाना होगा .. डिफ़ॉल्ट श्रोता या तो Debugger.Log को लिखते हैं (अगर यह लॉगिंग है) या सिस्टम 'OutputDebugString '। नोट: जब तक कि आपको अपने ट्रेस आउटपुट पर एकाधिक श्रोताओं को संलग्न करने की आवश्यकता न हो, Trace.WriteXX अभी भी उच्च प्रदर्शन लॉगिंग स्थितियों में उपयोग करने के लिए बहुत महंगा है। यदि आपको डीबग आउटपुट पर लिखना है तो आपको आउटपुटडिबगस्ट्रिंग फ़ंक्शन को कर्नल 32.dll पर सीधे कॉल करना चाहिए। (Trace.WriteLine से कम से कम 50% तेज) – headsling
सिस्टम के v2 में TraceSource के बारे में क्या है। डायग्नोसिक्स? यह log4net की तुलना में कैसे करता है? – Eatdoku