2009-09-15 14 views
5

(यह एक सामान्य काल्पनिक सवाल माना जाता था, मुझे शिकायत है कि नेट एक सुअर था और कारणों के लिए भीख माँग रहा है। यह वास्तव में मेरे विशिष्ट अनुप्रयोग के बारे में एक सवाल होने के लिए नहीं था।).NET इतना CPU का उपयोग क्यों करता है, क्या यह एक समस्या है?

वर्तमान में मैं कर रहा हूँ सी # में कुछ पुराने सी ++ कोड को फिर से लिखना। हम सभी विरासत अनुप्रयोगों पर पोर्टिंग कर रहे हैं। मेरे पास सी ++ एप्लिकेशन हैं जो MAX 3% CPU लेते हैं। ज्यादातर वे किसी का उपयोग नहीं करते हैं। मैं फिर कोड लेता हूं, कॉपी और पेस्ट करता हूं, फिर सी # सिंटैक्स और .NET पुस्तकालयों में सुधार करता हूं, और बीएएम! 50% सीपीयू। इसके लिए क्या कारण है? मैंने पहले सोचा था कि यह जेआईटी था, लेकिन प्रत्येक कोड पथ का अभ्यास करने के बाद भी, और पूरी बात जेआईटी एड, एक ही मुद्दा रही है।

मैंने भी बड़ी स्मृति वृद्धि देखी है। 9 एमबी पूर्ण लोड चलाने वाले ऐप्स अब 10 एमबी से शुरू होते हैं और 50 एमबी पर चलते हैं। मुझे लगता है कि हार्डवेयर सस्ता है, लेकिन मैं समझना चाहता हूं कि इसका क्या कारण है। क्या यह अलार्म का कारण है, या .NET बस इतना सुअर है?

अद्यतन 1 उत्तर स्कीट को

मैं के साथ सी # परिचित हूँ। मैं चीजों को लिंक में बदलता हूं, और इसी तरह। मैं आम तौर पर कोड लेता हूं और लाइनों की संख्या को कम करता हूं, और इसी तरह। क्या आप कुछ और उदाहरण दे सकते हैं कि सीई ++ व्यक्ति जो .NET में गलत करता है?

अद्यतन 2

यह एक सामान्य प्रश्न माना जाता था, लेकिन इस मुद्दे को वह विशेष अनुप्रयोग इस प्रकार है।

इसमें एक धागा है जो एक विरोधाभासी डीबी से डेटा प्राप्त करने के लिए उपयोग करता है और ओडीबीसी चालक है। इसके बाद यह एसक्यूएल डीबी में बदलने और इसे पोस्ट करने के लिए लिंक का उपयोग करता है। मैंने इसे एएनटीएस प्रोफाइलर के माध्यम से चलाया है, और ऐसा लगता है कि डेटा सेट भरने में सबसे अधिक समय लगता है। लिंक पोस्टिंग द्वारा पीछा किया। मुझे पता है कि मेरे कुछ क्षेत्र प्रतिबिंब उपयोग हैं, लेकिन मुझे नहीं पता कि मुझे यह करने के लिए क्या करना है। मैं अपनी स्ट्रिंग को स्ट्रिंग बिल्डर्स में बदलने की योजना बना रहा हूं। क्या इन दोनों के बीच कोई अंतर है?

(int)datarow["Index"] 

और

ConvertTo.Int32(datarow["Index"]) 

मैं प्रारूप तार करने के लिए सभी स्ट्रिंग संयोजन बदल दिया है। वह सिर पर कम नहीं किया था। क्या कोई डेटा रीडर बनाम डेटा एडाप्टर और डेटासेट के बीच अंतर जानता है?

+9

सैद्धांतिक उदाहरणों की आवश्यकता के बजाय, आप यह देखने के लिए बेहतर कर सकते हैं कि आपका एप्लिकेशन CPU क्यों खर्च कर रहा है, यह देखने के लिए बेहतर हो सकता है। – ChrisW

+1

लगता है जैसे यह ओडीबीसी के साथ बातचीत हो सकती है। क्या कोई "मूल" .NET पैराडाक्स ड्राइवर उपलब्ध है? –

+3

50% सीपीयू कितनी देर तक? किस काम के लिए? सीपीयू-गहन मिनी-बेंचमार्क में मैंने अध्ययन किया है, सी ++ सी # से तेज था, लेकिन ज्यादा नहीं। प्रत्येक मामले में मैंने उच्चतम थ्रूपुट प्राप्त करने के लिए सीपीयू को संतृप्त किया। – Cheeso

उत्तर

17

सी # और .NET के साथ आप कितने परिचित हैं? यदि आप सी ++ मुहावरे रखने वाले विरासत कोड पर बस पोर्टिंग कर रहे हैं, तो मुझे आश्चर्य नहीं है कि यह एक हॉग है। पोर्टफॉर्मिंग अनुप्रयोगों को एक मंच से दूसरे प्लेटफॉर्म पर लगभग एक अच्छा विचार नहीं है। (बेशक, आपने यह नहीं कहा है कि आपने निश्चित रूप से ऐसा किया है।) इसके अलावा, यदि आप विशेषज्ञ सी ++ डेवलपर हैं, लेकिन नौसिखिया .NET डेवलपर्स हैं, तो आपको अपने कोड पर प्रदर्शन करना चाहिए जैसे कि आप पर नौसिखियां हैं मंच।

हम वास्तव में यह नहीं बता सकते कि ऐप के बारे में और जानने के बिना प्रदर्शन क्या कर रहा है - हालांकि मुझे यह जानकर आश्चर्य नहीं होगा कि स्ट्रिंग कॉन्सटेनेशन अपराधी था। आपके पास बॉक्स पर कितने प्रोसेसर हैं? यदि यह 2, है तो एप्लिकेशन मूल रूप से ऊपर सब कुछ यह कर सकते हैं किसी एकल थ्रेड के लिए ले जा रहा है ...

नेट आम तौर पर एक सी ++ अनुप्रयोग से स्मृति के मामले में भारी होने जा रहा है, लेकिन होना चाहिए कम से कम तुलनीय अधिकांश कार्यों के लिए गति के मामले में। 9 एमबी की बजाए 50 एमबी की तुलना में मुझे लगता है कि मैं अपेक्षा करता हूं, लेकिन मैं तुरंत भी चिंतित नहीं होगा।

मेमोरी और सीपीयू प्रदर्शन दोनों को एक अच्छे प्रोफाइलर के उपयोग से जांच की जानी चाहिए। मैं JetBrains dotTrace Profiler की सिफारिश कर सकता हूं, लेकिन वहां बहुत सारे लोग हैं।

+0

क्या आप कुछ और उदाहरण दे सकते हैं? –

+0

एक नौसिखिया क्या होगा .NET बात एक सी ++ लड़का कर सकता है? –

+3

क्या के उदाहरण? आपके ऐप के बारे में कुछ भी जानने के बिना, यह अनुमान लगाना मुश्किल होगा कि बाधाएं कहां हो सकती हैं। यदि आप सावधान नहीं हैं तो भी LINQ का उपयोग करने से बाधा उत्पन्न हो सकती है। मैं वास्तव में एक प्रोफाइलर के लिए जाना होगा - कुछ भी अनुमान लगाया जाएगा। –

0

मैं कहूंगा कि स्मृति उपयोग शायद लाइन में है, लेकिन CPU उपयोग नहीं है।

लगता है जैसे आपके पास कोई धागा नहीं है जो उपज नहीं कर रहा है।

1

आपको CPU उपयोग में कुछ वृद्धि देखना चाहिए। 3% से 50% बहुत ज्यादा लगता है, यह किस तरह का कोड है?

स्मृति पदचिह्न केवल अपरिहार्य लागत है। .NET ऐप के लिए 30-50 एमबी के बीच कोई भी चीज़ सामान्य है। आम तौर पर, आपके .NET अनुप्रयोग का वास्तविक स्मृति उपयोग बहुत छोटा होता है, लेकिन वहां एक बड़ा रनटाइम ओवरहेड होता है जिसे आप टालना नहीं कर सकते (यह एक बार की लागत है, लेकिन यह वहां है) और यदि आप टन विधानसभाओं का संदर्भ देते हैं तो यह बहुत ही ध्यान देने योग्य है ।

0

मैं कुछ अनुमान के बारे में सोच सकते हैं:

1) मेमोरी - सी ++ स्मृति में कामयाब रहे नहीं है। इसलिए, यह स्मृति को तेजी से और (यदि प्रोग्राम किया गया है) पर इष्टतम समय पर मुक्त करता है।

प्रबंधित स्मृति के साथ, प्रोग्राम मूल रूप से "रिसाव" स्मृति को तब तक याद करेगा जब तक यह कचरा संयोजन करने का विकल्प नहीं चुनता। समय शायद इस बात पर निर्भर है कि प्रक्रिया में कितनी मेमोरी आवंटित की गई थी। डिफ़ॉल्ट व्यवहार को बदलने का शायद एक तरीका है, लेकिन एक छोटी मेमोरी आकार का मतलब है कि कचरा संग्रह संग्रह जल्द से जल्द और अक्सर होता है, जो प्रसंस्करण समय को प्रभावित करता है। यदि पर्याप्त ज्ञापन को आवंटित किया गया है तो जीसी को inv9ked होने की आवश्यकता नहीं हो सकती है।

2) क्या कार्यक्रम एक ही समय में चलता है, या कम? यदि यह 5 गुना प्रोसेसर पावर का उपयोग करता है लेकिन समय में 1/5 में पूरा होता है तो सीपीयू मूल रूप से बराबर होता है।

3) हाँ, .नेट शायद एक सुअर

+1

यदि आप कॉल कर रहे हैं। नेट एक सुअर आपका नाम बहुत उपयुक्त है –

+0

इसे प्राप्त नहीं हुआ :) व्यक्तिगत रूप से मुझे आजकल "सुअर" होने में कुछ भी गलत नहीं दिख रहा है .. मुझे वीबी .NET पसंद है, यह सबसे अच्छा प्रोग्रामिंग वातावरण है मैंने 80 के उत्तरार्ध में अंतःस्थापित किया है, और इसे एक ढांचे द्वारा समर्थित किया गया है जिसका उपयोग केवल शांत डेमो/शोध/अवधारणा के सबूत के बजाय व्यावसायिक आवेदकों को वितरित करने के लिए किया जा सकता है। मुझे लगता है कि जावा का मुख्य सबक था "अब एक सुअर बनना ठीक है .. हमारे पास पर्याप्त प्रसंस्करण शक्ति है" जो माइक्रोसॉफ्ट ने अपने दिमाग में, दिल में और फिर से लागू किया, एक बेहतर तरीके से (बेहतर आईडीई, बेहतर और अधिक कुशल जेनरेट कोड)। यह एक सुअर है लेकिन एक बहुत तेज़ सुअर :) –

6

AFAIK वहाँ (int)datarow["Index"] और ConvertTo.Int32(datarow["Index"]) के बीच litte अंतर है। क्योंकि यह अतिरिक्त कैशिंग रैंडम एक्सेस के लिए आवश्यक को खत्म करता है

int orderIndex = <order of Index column in projection list>; 
using (OdbcDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) 
{ 
    int Index = rdr.GetInt32(orderIndex); 
} 

SeqentialAccess आदेश व्यवहार, एसक्यूएल परिणाम पर कार्रवाई करने के fastes तरीका है: लेकिन वहाँ एक बड़ा अंतर है, तो आप धारा मोड डेटा रीडर का उपयोग करते है।

एक दूसरी सूचना यह है कि ऐसा लगता है कि आप डेटा सेट का उपयोग कर रहे हैं। डेटा सेट का उपयोग करना आसान है, लेकिन वे 'फास्ट' कहने वाले लोगों से बहुत दूर हैं। डेटा सेट के साथ आप मूल रूप से मेमोरी स्टोरेज इंजन में चल रहे हैं (मुझे लगता है कि Rushmore पर आधारित है)। यदि आप हर सीपीयू चक्र और रैम के हर बिट से सभी 1s निचोड़ना चाहते हैं, तो आपको दुबला घटकों (उदाहरण के लिए डेटासेट्स और डेटाटेबल्स के बजाय structs के कच्चे सरणी) का उपयोग करना होगा।

जब आप सेब से सेब की तुलना करते हैं तो सीएलआर देशी कोड के खिलाफ अपना जमीन पकड़ सकता है। आईएल कोड NGEN के साथ तैनाती के समय पर nativized किया जा सकता है। bounds checks can be avoided जैसे विशिष्ट सीएलआर ओवरहेड। जीसी प्री-एम्प्शन 'पॉज़' केवल तब होता है जब आप अपने आवंटन से लापरवाही रखते हैं (सिर्फ इसलिए कि आपके पास जीसी का मतलब यह नहीं है कि आपको बाएं और दाएं आवंटित करना चाहिए)। और सीएलआर में वास्तव में कुछ लेस मेमोरी लेआउट की बात आती है जब यह मेमोरी लेआउट की बात आती है क्योंकि यह एक्सेस पैटर्न को फिट करने और टीएलबी और एल 2 इलाके में सुधार करने के लिए मेमोरी में ऑब्जेक्ट को पुनर्व्यवस्थित कर सकती है।

बीटीडब्ल्यू, अगर आपको लगता है कि बहस 'सी ++ सी # के आसपास सर्किल चला सकती है तो कुछ नया है, मुझे याद है कि सी सी ++ के आसपास सर्किल चला सकता है (' आभासी कॉल असंभव धीमी 'वे कह रहे थे) और मैं वहां सुनता हूं एक समय असेंबली सी

संबंधित मुद्दे