2017-10-16 12 views
6

संदर्भ: मैं एक उच्च प्रदर्शन सी ++ 11 एप्लिकेशन लिख रहा हूं, इसका एक हिस्सा निष्क्रिय कनेक्शन को हटाना है। इसके लिए, मैं अपने कनेक्शन ऑब्जेक्ट में "आखिरी गतिविधि" टाइमस्टैम्प संग्रहीत कर रहा हूं, जो कि जब कोई कार्रवाई की जाती है तो मैं अपडेट करता हूं। मेरे पास एक टाइमर होता है जो हर कुछ सेकंड में चलता है, सभी सत्रों में लूप करता है, और निष्क्रिय लोगों को हटा देता है।सी ++ 11 में वर्तमान समय प्राप्त करने का सबसे तेज़ तरीका क्या है?

वर्तमान में मैं इस कोड का उपयोग कर रहा हूँ वर्तमान टाइमस्टैम्प प्राप्त करने के लिए:

timestamp = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count() 

अगर वहाँ यह करने के लिए किसी भी तेज़ तरीका है मैं सोच रहा हूँ? तेजी से मेरा मतलब है टाइमस्टैम्प प्राप्त करने का प्रदर्शन, टाइमस्टैम्प का संकल्प नहीं।

संकल्प मेरे विशिष्ट अनुप्रयोग के लिए वास्तव में महत्वपूर्ण नहीं है, यह एक सेकंड के रूप में कम हो सकता है। इसके अलावा, यूटीसी/स्थानीय कोई फर्क नहीं पड़ता, मैं केवल उसी समय से प्राप्त अन्य टाइमस्टैम्प की तुलना करने के लिए टाइमस्टैम्प का उपयोग कर रहा हूं।

मैं इसे क्रॉस-प्लेटफ़ॉर्म रखना चाहता हूं, लेकिन सशर्त संकलन के साथ प्लेटफ़ॉर्म-विशिष्ट अनुकूलन का भी स्वागत है।

+7

आप 'timestamp = system_clock :: अब(); 'क्यों नहीं करते हैं? – nwp

+5

क्या आपने * मापा * है कि टाइमस्टैम्प-फ़ेचिंग एक बाधा है? क्या आपने (अनुकूलित!) जेनरेट की गई मशीन कोड की जांच की है? –

+0

@nwp में जोड़ने के लिए, आप बस 'system_clock :: अब() - टाइमस्टैम्प <टाइमआउट' देख सकते हैं। –

उत्तर

5

यदि प्रदर्शन वास्तव में एक मुद्दा है, और सटीकता नहीं है, तो आपको टाइमस्टैम्प का उपयोग करने की आवश्यकता नहीं हो सकती है। इसके बजाय बस प्रत्येक कनेक्शन के लिए काउंटर रखें, और कनेक्शन के लिए जब भी गतिविधि होती है, काउंटर को शून्य पर रीसेट करें। जब भी आपका टाइमर बंद हो जाता है, तो यह प्रत्येक कनेक्शन के लिए काउंटर बढ़ाता है, और किसी भी कनेक्शन को डिस्कनेक्ट करता है जिसका काउंटर वैल्यू ऊपर बढ़ता है (एन) (एन के किसी भी मूल्य के लिए जो आपको सबसे अच्छा काम करता है)

+1

और यदि आप सफाई कार्य टाइमर परिशुद्धता के मामले में नहीं चाहते हैं, तो यह आखिरी बार चलने के बाद से समय रिकॉर्ड करता है और * जितना * * बढ़ता काउंटर होता है।अब आप ओपी के समाधान का एक सभ्य अनुमान लगा रहे हैं, और केवल एक बार * गैर-प्रदर्शन आलोचना धागे पर हर कुछ सेकंड की गणना कर रहे हैं। – Yakk

0

आप प्रति थ्रेड स्थानीय चर बनाए रख सकते हैं धागा, और प्रत्येक 1 मिलीसेकंड थ्रेड को जागृत करने के लिए प्रति थ्रेडफर्ड प्रति थ्रेड (या आप चयन/एपॉल टाइमआउट पैरामीटर का उपयोग कर सकते हैं), जब चयन/epoll_wait वापस आते हैं, तो आप टाइमस्टैंप प्राप्त करने के लिए अब() कॉल करते हैं, और टाइमस्टैम्प को सहेजते हैं धागा स्थानीय चर।

आप वैश्विक चर का भी उपयोग कर सकते हैं, उदाहरण के लिए, std :: atomic, और चयन/epoll (किसी भी थ्रेड में) लौटने पर इसे अपडेट करें। यदि आपको अभी भी लगता है कि यह एक बाधा है, तो टाइमरफ़ेड के साथ एक थ्रेड का उपयोग करें और प्रत्येक 1 मिलसेकंड टाइमस्टैम्प अपडेट करें।

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

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