मैंने एक सी ++ लाइब्रेरी लिखी है जो कुछ गंभीर रूप से भारी CPU काम करता है (यह सब गणित और गणना) और यदि अपने डिवाइस पर छोड़ा गया है, तो आसानी से उपलब्ध सभी CPU संसाधनों का 100% उपभोग करेगा (यह भी संख्या के लिए बहुप्रचारित है मशीन पर उपलब्ध तार्किक कोर)।धागे को धीमा करने का सबसे अच्छा तरीका? नींद का उपयोग कर रहा है() ठीक है?
इस तरह के रूप में, मैं मुख्य गणना पाश अंदर एक कॉलबैक कि सॉफ्टवेयर का उपयोग कर पुस्तकालय कॉल करने के लिए माना जाता है है:
while(true)
{
//do math here
callback(percent_complete);
}
कॉलबैक में, ग्राहक नींद (एक्स) धागा धीमा करने के लिए कहता है।
मूल रूप से, क्लाइंटसाइड कोड एक निश्चित नींद (100) कॉल था, लेकिन इससे खराब अविश्वसनीय प्रदर्शन हुआ क्योंकि कुछ मशीनें गणित को दूसरों की तुलना में तेज़ी से खत्म करती हैं, लेकिन नींद सभी मशीनों पर समान होती है। तो अब ग्राहक सिस्टम समय की जांच करता है, और यदि 1 सेकंड से अधिक पास हो गया है (जो == कई पुनरावृत्तियों), तो यह आधे सेकेंड तक सो जाएगा।
क्या यह धागा धीमा करने का एक स्वीकार्य तरीका है? क्या मुझे प्रदर्शन को अधिकतम करने के लिए स्लीप() के बजाय सेमाफोर/म्यूटेक्स का उपयोग करना चाहिए? प्रसंस्करण कार्य के प्रत्येक 1 सेकंड के लिए एक्स मिलीसेकंड सो रहा है या क्या कुछ गलत है जिसे मैं नहीं देख रहा हूं?
कारण मैं पूछता हूं कि मशीन अभी भी भारी हो गई है, भले ही कार्यकर्ता CPU की ~ 10% प्रक्रिया को दिखाता है। मैंने पहले से ही हार्ड डिस्क और मेमोरी विवाद की खोज नहीं की है, इसलिए अब मैं सोच रहा हूं कि जिस तरह से मैं धागे को धीमा कर रहा हूं, इस समस्या का कारण बन रहा है।
धन्यवाद!
लिनक्स पर, यदि आप अपनी प्रक्रिया को उच्च स्तर के साथ चलाते हैं, तो ओएस CPU घड़ी को कम रखेगा, मान लें कि आपका हार्डवेयर CPU गति स्केलिंग का समर्थन करता है। यह कृत्रिम थ्रॉटलिंग के बिना बिजली, गर्मी और शोर को कम रखेगा। – karunski
स्वीट। पूरी तरह से लिनक्स पर स्विच करना एक विकल्प है जिसे मैं लगातार मानता हूं और अब तक हमेशा अस्वीकार करता हूं ... –