2010-04-29 13 views
9

मैं अनिवार्य रूप से getTickCount() विंडोज फ़ंक्शन का पुनर्निर्माण करना चाहता हूं ताकि मैं इसे बिना किसी गैर मानक पुस्तकालयों या यहां तक ​​कि एसटीएल के मूल सी ++ में उपयोग कर सकूं।मूल सी ++ के साथ सिस्टम टिक गिनती प्राप्त करना?

मैं कम से

घड़ी()

स्थानीयसमय

समय

लेकिन मैं कर रहा हूँ ध्यान दिया है (तो यह पुस्तकालयों एंड्रॉयड NDK के साथ आपूर्ति का अनुपालन) अभी भी अनिश्चित है कि टाइम लाइब्रेरी के साथ GetTickCount विंडोज फ़ंक्शन को दोहराना संभव है या नहीं।

क्या कोई मुझे सही दिशा में इंगित कर सकता है कि यह कैसे करें या यहां तक ​​कि यदि संभव हो तो भी?

मुझे क्या करना चाहते हैं का अवलोकन:

मैं गणना करने के लिए कितनी देर तक एक आवेदन किया गया है एक निश्चित समारोह "कर" सक्षम होना चाहते हैं।

इसलिए उदाहरण के लिए मैं गणना करने के लिए कितनी देर तक आवेदन एक सर्वर

मैं linux एंड्रॉयड आधारित पर चलने के लिए खिड़कियों से यह बंदरगाह के लिए कोशिश कर रहा हूँ के साथ रजिस्टर करने की कोशिश कर दिया गया है सक्षम होना चाहते हैं, यहाँ खिड़कियां है कोड:


int TimeoutTimer::GetSpentTime() const 
{ 
if (m_On) 
{ 
    if (m_Freq>1) 
    { 
     unsigned int now; 
     QueryPerformanceCounter((int*)&now); 
     return (int)((1000*(now-m_Start))/m_Freq); 
    } 
    else 
    { 
     return (GetTickCount()-(int)m_Start); 
    } 
} 
return -1; 
} 
+0

आप क्या हासिल करने की कोशिश कर रहे हैं? ऐसा करने के तरीके हो सकते हैं। शायद एक कदम वापस लें और सामान्य समस्या की व्याख्या करें। – Tim

+0

अच्छा विचार, मैं यह गणना करने में सक्षम होना चाहता हूं कि कोई एप्लिकेशन एक निश्चित कार्य "कितना समय" कर रहा है। तो उदाहरण के लिए मैं यह गणना करने में सक्षम होना चाहता हूं कि एप्लिकेशन –

+0

सर्वर के साथ पंजीकरण करने का प्रयास कर रहा है, उस स्थिति में यह संभवतः एक ऑब्जेक्ट ढूंढने/बनाने के लिए बहुत छोटा है जो विलुप्त समय का पता लगा सकता है। क्या आप थ्रेड/निर्धारित समय, या समग्र घड़ी/दीवार के समय की तलाश में हैं? – Tim

उत्तर

18

एंड्रॉइड एनडीके पर आप POSIX clock_gettime() कॉल का उपयोग कर सकते हैं, जो libc का हिस्सा है। यह फ़ंक्शन है जहां विभिन्न एंड्रॉइड टाइमर कॉल समाप्त होते हैं।

उदाहरण के लिए, java.lang.System.nanoTime() के साथ लागू किया जाता है:

struct timespec now; 
clock_gettime(CLOCK_MONOTONIC, &now); 
return (u8)now.tv_sec*1000000000LL + now.tv_nsec; 

यह उदाहरण monotonic घड़ी, का उपयोग करता है जो आप क्या चाहते हैं अवधि की गणना करते समय। दीवार घड़ी के विपरीत (gettimeofday() के माध्यम से उपलब्ध), जब नेटवर्क प्रदाता द्वारा डिवाइस की घड़ी बदल जाती है तो यह आगे या पीछे नहीं छोड़ी जाएगी।

घड़ी_gettime() के लिए लिनक्स मैन पेज अन्य घड़ियों का वर्णन करता है जो कि उपलब्ध हो सकते हैं, जैसे कि प्रति-थ्रेड सीपीयू समय समाप्त हो गया है।

1

यह संभव नहीं है। सी ++ मानक और, मानक पुस्तकालय के परिणामस्वरूप, प्रोसेसर या 'टिक' के बारे में कुछ भी नहीं पता। यह थ्रेडिंग समर्थन के साथ सी ++ 0x में बदल सकता है या नहीं, लेकिन कम से कम अभी तक, यह संभव नहीं है।

1

क्या आपके पास एंड्रॉइड पर एक vblank इंटरप्ट फ़ंक्शन (या hblank) तक पहुंच है? यदि ऐसा है, तो एक टाइमर के लिए एक वैश्विक, अस्थिर var वृद्धि।

3

यह मंच निर्भर है इसलिए आपको केवल एक रैपर लिखना होगा और प्रत्येक प्लेटफॉर्म के लिए विनिर्देशों को लागू करना होगा।

+0

एंड्रॉइड पर केवल मूलभूत सी पुस्तकालय प्रदान किए जाते हैं, जो आप यहां सी लाइब्रेरी के अंतर्गत देखते हैं - http://www.cplusplus.com/reference/clibrary/, इसमें कोई अतिरिक्त प्लेटफार्म स्पेकिस एक्स्ट्रा –

+1

नहीं है सी पुस्तकालय में समय है। क्या यह उपलब्ध नहीं है?यह आपको समय का बड़ा संकल्प नहीं दे सकता है, लेकिन आपकी आवश्यकताओं के लिए पर्याप्त होना चाहिए। विलुप्त समय प्राप्त करने के लिए CLOCKS_PER_SEC के साथ घड़ी() का उपयोग करें। – daramarak

+0

@ दशमराक घड़ी() प्रक्रिया समय लौटाता है, सिस्टम समय नहीं। – darron

9

clock() विंडोज के GetTickCount() के समान ही काम करता है। इकाइयां अलग हो सकती हैं। GetTickCount() मिलीसेकंड देता है। clock() प्रति सेकंड CLOCKS_PER_SEC रिटर्न देता है। दोनों में अधिकतम अधिकतम रोल रोलवर होगा (विंडोज़ के लिए, यह लगभग 49.7 दिन है)।

GetTickCount() ओएस शुरू होने पर शून्य से शुरू होता है। दस्तावेज़ों से, ऐसा लगता है कि प्रक्रिया होने पर clock() प्रारंभ होता है। इस प्रकार आप GetTickCount() के साथ प्रक्रियाओं के बीच के समय की तुलना कर सकते हैं, लेकिन शायद आप clock() के साथ ऐसा नहीं कर सकते हैं।

आप गणना करने के लिए, कितनी देर तक कुछ हो रहा है एक भी प्रक्रिया के भीतर की कोशिश कर रहे हैं, और आप रोल ओवर के बारे में चिंतित नहीं हैं, तो:

const clock_t start = clock(); 
// do stuff here 
clock_t now = clock(); 
clock_t delta = now - start; 
double seconds_elapsed = static_cast<double>(delta)/CLOCKS_PER_SEC; 

स्पष्टीकरण: कि क्या में अनिश्चितता हो रहा है clock() दीवार समय या प्रोसेसर समय बीत चुका है। मैंने देखा कि पहले कई संदर्भ दीवार समय कहते हैं।उदाहरण के लिए:

Returns the number of clock ticks elapsed since the program was launched.

जो बेशक एक छोटे से अस्पष्ट है। MSDN अधिक स्पष्ट है:

The elapsed wall-clock time since the start of the process....

उपयोगकर्ता darron मुझे आश्वस्त बेहतर जानकारी के लिए, तो मैं सी मानक (आईएसओ/आईईसी 9899: TC2) के एक मसौदे नकल पाया, और यह कहते हैं:

... प्रोसेसर इस्तेमाल किया-समय पर कार्यान्वयन के करीबी अनुमान ... रिटर्न

मेरा मानना ​​है कि मैंने जो भी कार्यान्वयन किया है, वह दीवार घड़ी का समय देता है (जो मुझे लगता है कि प्रसंस्करण समय का अनुमान लगाया जाता है)।

निष्कर्ष: यदि आप समय कोड करने का प्रयास कर रहे हैं तो आप विभिन्न अनुकूलन को बेंचमार्क कर सकते हैं, तो मेरा उत्तर उचित है। यदि आप वास्तविक दीवार घड़ी के समय के आधार पर एक टाइमआउट लागू करने का प्रयास कर रहे हैं, तो आपको clock() के स्थानीय कार्यान्वयन की जांच करनी होगी या किसी अन्य फ़ंक्शन का उपयोग करना होगा जो वॉल्यूम घड़ी के समय को देने के लिए प्रलेखित है।

अद्यतन: सी ++ 11 के साथ, मानक पुस्तकालय का भी हिस्सा है, जो समय और अवधि को पकड़ने के लिए विभिन्न प्रकार के घड़ियों और प्रकार प्रदान करता है। मानकीकृत और व्यापक रूप से उपलब्ध होने पर, यह स्पष्ट नहीं है कि एंड्रॉइड एनडीके अभी तक पूरी तरह से समर्थन करता है या नहीं।

+0

यह सच नहीं है। घड़ी() प्रक्रिया द्वारा बिताए गए समय को लौटाती है, जो आमतौर पर कुल सिस्टम समय से बहुत छोटी होती है। – darron

+0

@ डेरॉन: मैंने घड़ी नहीं कहा() सिस्टम समय लौटाता है। वास्तव में, मैंने दूसरे पैराग्राफ में अंतर को इंगित किया। सवाल ने समय के लिए पूछा कि मानक सी ++ पुस्तकालयों का उपयोग करने में कितना समय लगता है। मेरा जवाब बताता है कि यह कैसे करें। –

+0

खैर, पहला और अंतिम अनुच्छेद दूसरे के अस्तित्व को अनदेखा कर रहा है। उदाहरण कोड आपको प्रक्रिया पर समय SPENT देगा, न कि 'प्रारंभ' के बाद दीवार घड़ी का समय। इसलिए, यदि आपके पास दिनों के लिए बहुत हल्की प्रक्रिया चल रही है, तो घड़ी केवल 5 सेकंड हो सकती है। यह गेटटिकउंट() के समान नहीं है, इसके अलावा कुछ समय के साथ। मुझे पता है कि यह एक पुराना प्रश्न/उत्तर है लेकिन लोग अभी भी इन चीजों को ढूंढते हैं और प्रदान की गई जानकारी का उपयोग करने का प्रयास करते हैं। – darron

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