2010-03-28 11 views
5

Greets-जावा CPU उपयोग को कम

हम काम में कुछ nutters जो अपने कोड में

while(true) { //Code } 

उपयोग का आनंद ले gots। जैसा कि आप कल्पना कर सकते हैं कि यह CPU को अधिकतम करता है। क्या कोई CPU उपयोग को कम करने के तरीकों को जानता है ताकि अन्य लोग सर्वर का भी उपयोग कर सकें।

कोड स्वयं ही साइटों पर अपडेट के लिए लगातार इंटरनेट मतदान कर रहा है। इसलिए मुझे लगता है कि एक छोटी नींद विधि CPU उपयोग को बहुत कम कर देगी।

स्ट्रिंग ऑब्जेक्ट्स (जावा) में भी सभी हेरफेर किया जा रहा है, किसी को भी पता है कि स्ट्रिंगबिल्डर कितने सिर को कम कर देगा?

किसी भी संकेत दिए गए के लिए धन्यवाद

+4

'जबकि (सत्य) 'बस एक मुहावरे है जो कहता है" यह हमेशा के लिए करें। " अपने आप से, यह कुछ भी नहीं करता है; इसके भीतर कोड सीपीयू चक्रों का उपभोग करता है। यदि अंदर कोड नेटवर्क अनुरोध कर रहा है, तो ऐसा करने पर यह अपना टाइमलाइस छोड़ देगा, इसलिए अन्य उपयोगकर्ता उन्हें प्राप्त करेंगे; एक 'नींद()' को समग्र सर्वर थ्रूपुट को महत्वपूर्ण रूप से प्रभावित नहीं करना चाहिए (हालांकि यह उन सर्वरों के लिए एक अच्छी बात होगी जो प्रोग्राम द्वारा हिट हो रही हैं)। और अंत में, 'स्ट्रिंगबिल्डर' या (अधिक संभावना) प्रदर्शन में सुधार नहीं कर सकता है। लेकिन यही कारण है कि प्रोफाइलर मौजूद हैं: वे आपको बता सकते हैं कि कार्यक्रम में सबसे अधिक समय क्या ले रहा है। – kdgregory

+3

सीपीयू कहां जाता है यह पहचानने के लिए हमेशा एक प्रोफाइलर चलाएं। फिर उस डेटा का उपयोग सिर पर जिम्मेदार डेवलपर को हरा करने के लिए करें। –

+0

क्या ऑपरेटिंग सिस्टम? –

उत्तर

6

मैं अपने दूसरे प्रश्न के साथ प्रारंभ करेंगे की कोशिश कर सकते हैं, मैं बाकी है कि StringBuilder बनाम स्ट्रिंग बहुत बहुत विशेष स्ट्रिंग जोड़तोड़ पर निर्भर है के साथ सहमत करना चाहते हैं। मैंने इसे एक बार "बेंचमार्क" किया था और आम तौर पर नए स्ट्रिंग आवंटन की मात्रा बढ़ जाती थी (आमतौर पर कॉन्सटेनेशन के रूप में) समग्र निष्पादन समय बढ़ गया था। मैं विवरण में नहीं जाऊंगा और केवल यह कहूंगा कि स्ट्रिंगबिल्डर, स्ट्रिंगबफर, स्ट्रिंग.फॉर्मैट(), संदेशफॉर्मेट की तुलना में सबसे अधिक कुशल ओवरटाइम बन गया है ...

अंगूठे का मेरा नियम यह है कि जब भी मैं एक साथ 3 से अधिक स्ट्रिंग को एक साथ जोड़ना चाहता हूं मैं हमेशा स्ट्रिंगबिल्डर का उपयोग करता हूं।

आपके पहले प्रश्न के लिए। हमें CPU उपयोग को 5% तक लाने की आवश्यकता थी। एक आसान काम नहीं है। हमने सीपीयू गहन विधि के किसी भी विधि निष्पादन से पहले Thread.sleep() को जोड़ने के लिए स्प्रिंग के एओपी तंत्र का उपयोग किया था। Thread.sleep() केवल तभी लागू किया जाएगा जब कुछ सीमा पार हो गई हो। मुझे यह कहने में खेद है कि इस सीमा की गणना इतना आसान नहीं है। और यह भी कहना है कि मुझे अभी भी नेट पर पोस्ट करने की अनुमति नहीं मिली है। तो यह आपको एक दिलचस्प लेकिन जटिल ट्रैक पर रखने के लिए है जो समय के साथ काम करने के लिए साबित हुआ है।

+2

क्या संभावित तर्क "5% से अधिक CPU समय" की आवश्यकता को जन्म दे सकता है? यदि आपके पास एक सीपीयू-गहन कार्य है, तो आपके पास एक सीपीयू-गहन कार्य है। इसके चारों ओर कोई रास्ता नहीं है, और आपके कोड में नींद जोड़ना बस उस कार्य को अधिक समय तक ले जाता है। यदि आप समग्र सिस्टम संसाधनों पर किसी विशेष कार्यक्रम के प्रभाव के बारे में चिंतित हैं, तो उस कार्यक्रम की प्राथमिकता को कम करने के लिए यह अधिक बुद्धिमान है। या एक और कंप्यूटर खरीदो। – kdgregory

+1

व्यक्तिगत रूप से, मैं आपसे अधिक सहमत नहीं हो सका! फिर भी मैं एक मात्र प्रोग्रामर हूं और इस समाधान को "इंजीनियर" नहीं किया। मेरा एकमात्र बिंदु यह था कि यदि इस प्रकार की चीज हो, तो हो सकता है :) – Yaneeve

+0

@Yaneeve .. यह पूछने में बहुत देर हो चुकी है। आपने गति और सीपीयू उपयोग के बीच ट्रेडऑफ का प्रबंधन कैसे किया? मुझे यकीन है कि नींद का प्रदर्शन प्रभाव पड़ा क्योंकि यह निष्पादन समय में वृद्धि हुई। – bluelurker

2

इसे फिर से फायरिंग, इस तरह से पहले कुछ समय तक इंतजार करें:

while(true) { 
    //Code 
    Thread.sleep (1000); //Wait 1 second 
} 

दूसरे प्रश्न का सवाल है, यह स्मृति और संभवतः CPU उपयोग के साथ-साथ कम होगी, लेकिन लाभ वास्तव में उन तारों के साथ क्या हो रहा है पर निर्भर करता है।

4

उन साइटों को कितनी बार अपडेट किया जाता है? आप शायद मेजबानों को वास्तव में परेशान कर रहे हैं। लूप के अंत में बस Thread.sleep(60 * 1000); चिपकाएं और आप इससे बच सकते हैं। वह उन्हें एक मिनट में एक बार मतदान करेगा-निश्चित रूप से यह पर्याप्त है?

2

एक नींद सीपीयू उपयोग को कम कर देगी। स्ट्रिंगबिल्डर के लिए वे स्मृति उपयोग को कम कर सकते हैं और प्रदर्शन में सुधार कर सकते हैं।

0

तुम भी

Thread.yield() 
+3

@ हेल्पर विधि - "यील्ड" केवल वर्तमान में निष्पादित थ्रेड ऑब्जेक्ट को अस्थायी रूप से निष्पादित करता है रोकें और अन्य धागे को निष्पादित करने दें ... इसलिए यह सीपीयू उपयोग को कम कर देगा यदि समानांतर में चल रहे किसी भी अन्य उपयोगकर्ता अनुप्रयोग हैं। "नींद" वह जो हासिल करना चाहता है उसके लिए पर्याप्त होगा। – XpiritO

+0

@XpritO Sry, आप सही हैं। ओपी का मुद्दा काफी नहीं मिला।शायद मुझे अपनी दूसरी कॉफी ^^ से पहले पोस्ट नहीं पढ़ना चाहिए। – helpermethod

+0

यही कारण है कि 5% CPU लोड में, अन्य ऐप्स को उसी कंप्यूटर पर 'सांस लेने' की जगह देने के लिए, और कोड के महत्वपूर्ण स्थानों में कुछ थ्रेड.इल्ड() डालकर हासिल किया जा सकता है। मैं ऐसा कर रहा हूं और यह सामान्य सॉफ्टवेयर उपयोग अनुभव के बिंदु से बहुत उपयोगी है .. –

7

StringBuilder के बारे में बहुत से "लोक ज्ञान" गलत है।उदाहरण के लिए, यह बदल रही:

String s = s1 + ":" + s2 + ":" + s3; 
इस के लिए

:

StringBuilder sb = new StringBuilder(s1); 
sb.append(":"); 
sb.append(s2); 
sb.append(":"); 
sb.append(s3); 
String s = sb.toString(); 

शायद यह किसी भी तेजी से जाना नहीं होगा। ऐसा इसलिए है क्योंकि जावा कंपाइलर वास्तव में एक अस्थायी स्ट्रिंगबिल्डर को जोड़ने के बराबर अनुक्रम में संयोजन संयोजन का अनुवाद करता है। जब तक आप एक लूप में स्ट्रिंग्स को संयोजित नहीं कर रहे हैं, तो आप केवल + ऑपरेटर का उपयोग करने के बेहतर हैं। आपका कोड पढ़ना आसान होगा।

दूसरा बिंदु यह होना चाहिए कि आपको अपने कोड के स्थानों की पहचान करने के लिए एक प्रोफाइलर का उपयोग करना चाहिए जो प्रदर्शन से बेहतर प्रदर्शन के लिए लाभ से लाभान्वित होगा। अनुकूलन के लायक होने के बारे में अधिकांश डेवलपर्स के अंतर्ज्ञान विश्वसनीय नहीं हैं।

0

, तो उनके कोड एक अलग JVM में है और लिनक्स या कुछ अन्य यूनिक्स पर चल रहा है अच्छा 20.

में अपने कार्यक्रम चलाने के लिए उन्हें आवश्यकता होती है या फिर आप उन्हें VirtualBox और उपयोग की तरह एक आभासी मशीन के अंदर चला सकें यह प्रोसेसर उपयोग को सीमित करने के लिए।

या यदि आप कुछ घटना-संचालित मॉडल या Thread.sleep का उपयोग करने के बजाए चक्रों को जलाते हैं तो आप उन्हें आग लगा सकते हैं।

0

कभी भी ऐसा न मानें कि कोड में जो कुछ आप देखते हैं वह प्रदर्शन के लिए खराब (या अच्छा) है। प्रदर्शन मुद्दे कुख्यात भ्रामक हैं।

Here's an easy way to see for sure what is taking the time.

0
  1. कोड मतदान क्या साइटों है? क्या वे एक आरएसएस पुश का समर्थन करते हैं?
  2. यदि वे करते हैं, तो साइटों को मतदान करने की कोई आवश्यकता नहीं है, और इसके बजाय अपडेट के लिए मॉड्यूल प्लग करें। वर्तमान विधि तब wait();
  3. का उपयोग करने का इंतजार कर रही है तो नया मॉड्यूल notifyAll() का उपयोग करके इस विधि के साथ ऑब्जेक्ट को सूचित करता है।
  4. मान्य है कि यह कुछ अतिरिक्त काम है, लेकिन यह पूरी तरह से बैंडविड्थ और गणना को बचाता है।
संबंधित मुद्दे