2009-03-13 19 views
9

मैं कुछ कोड के लिए QueryPerformanceCounter का उपयोग कर रहा हूं। जब कोड रिपोर्टिंग समय शुरू कर रहा था तो स्पष्ट रूप से गलत था जब मैं चौंक गया था। 'असली' बार जब आप आवृत्ति QueryPerformanceFrequency से लौटे द्वारा विभाजित करने की आवश्यकता में QPC के परिणाम को बदलने के लिए है, तो बीता हुआ समय है:सीपीयू घड़ी आवृत्ति और इस प्रकार क्वेरीरीफॉर्मेंस काउंटर गलत है?

समय = (QPC.end - QPC.start)/QPF

के बाद एक रिबूट, क्यूपीएफ आवृत्ति 2.7 गीगाहर्ट्ज से 4.1 गीगाहर्ट्ज तक बदल गई। मुझे नहीं लगता कि वास्तविक हार्डवेयर आवृत्ति बदल गई क्योंकि चल रहे कार्यक्रम की दीवार घड़ी का समय नहीं बदला गया था, हालांकि क्यूपीसी का उपयोग करने की सूचना में बदलाव आया था (यह 2.7/4.1 तक गिर गया)।

MyComputer-> गुण दिखाता है:

इंटेल (आर) पेंटियम (आर) 4 सीपीयू 2.80 गीगा; 4.11 गीगाहर्ट्ज; 1.99 जीबी रैम; भौतिक पता एक्सटेंशन

इसके अलावा, सिस्टम ठीक काम कर रहा है।

मैं समस्या को साफ़ करने के लिए रीबूट करने का प्रयास करूंगा, लेकिन मुझे चिंता है कि ये महत्वपूर्ण प्रदर्शन काउंटर चेतावनी के बिना अमान्य हो सकते हैं।

अद्यतन:

जब मैं जवाब और विशेष रूप से लिंक की सराहना करते हैं, मैं प्रभावित चिपसेट में से एक है और न ही मैं एक CPU घड़ी है जो अपने आप भिन्न होता है करने के लिए नहीं है। मैंने जो पढ़ा है, उससे क्यूपीसी और क्यूपीएफ पीसीआई बस में टाइमर पर आधारित हैं और सीपीयू घड़ी में बदलाव से प्रभावित नहीं हैं। मेरी स्थिति में अजीब चीज यह है कि क्यूपीएफ द्वारा रिपोर्ट की गई फ्रीक्वेंसी गलत मान में बदल गई है और यह बदली आवृत्ति भी माइक्रॉम्प्यूटर -> गुणों में दर्ज की गई है जो मैंने निश्चित रूप से नहीं लिखा था।

एक रीबूट मेरी समस्या को ठीक करता है (क्यूपीएफ अब सही आवृत्ति की रिपोर्ट करता है) लेकिन मुझे लगता है कि यदि आप क्यूपीसी/क्यूपीएफ का उपयोग करने की योजना बना रहे हैं तो आपको इसे विश्वास करने से पहले किसी अन्य टाइमर के खिलाफ सत्यापित करना चाहिए।

+0

कार्रवाई में स्पीडस्टेप? – vladr

+0

क्यूपीसी और क्यूपीएफ कुख्यात अविश्वसनीय हैं, एमएसडीएन दस्तावेज जानबूझकर भ्रामक है (एमएस का दावा है कि यदि मूल्य गलत है, तो यह बीआईओएस निर्माता की गलती है, जबकि अभी भी इस बात का दावा करना वास्तविक है ... लेकिन मुझे यकीन है कि अगर कुछ जाता है इसके कारण गलत, उपयोगकर्ता आपको दोष देंगे, BIOS निर्माता नहीं) – speeder

उत्तर

4

स्पष्ट रूप से कुछ चिपसेट पर क्यूपीसी के साथ एक ज्ञात issue है, इसलिए आप यह सुनिश्चित करना चाहते हैं कि आपके पास चिपसेट नहीं है। इसके अतिरिक्त कुछ ड्यूल कोर एएमडी भी problem का कारण बन सकते हैं।

QueryPerformanceCounter() और QueryPerformanceFrequency() एक सा बेहतर संकल्प प्रस्तुत करते हैं, लेकिन अलग मुद्दे हैं: sebbbi, वह जहां राज्यों द्वारा दूसरे पोस्ट देखें। Windows XP में उदाहरण के लिए, सभी एएमडी एथलॉन X2 दोहरे कोर सीपीयू लौट दोनों में से किसी के पीसी कोर "बेतरतीब ढंग से" (पीसी कभी कभी कूदता थोड़ा पीछे की ओर), जब तक आप विशेष रूप से एएमडी डुअल कोर चालक को स्थापित पैकेज समस्या को ठीक करें। हमारे पास ने अन्य किसी भी दोहरे + कोर CPUs को समान समस्याएं (पी 4 डुअल, पी 4 एचटी, कोर 2 डुअल, कोर 2 क्वाड, फेनोम क्वाड) देखा है।

इस answer से।

+1

निश्चित रूप से एक मुद्दा है, लेकिन उसकी समस्या नहीं है; मुझे डर है - वह इंटेल पर है। मैं स्पीडस्टेप पर अपना पैसा लगाकर उसे मार डालता हूं। – vladr

+0

हा! मुझे यह मुद्दा था। बहुत कष्टप्रद। –

1

आप चाहिए हमेशा कोर आवृत्ति किसी भी सीपीयू कि SpeedStep या Cool'n'Quiet के रूप में प्रौद्योगिकी जैसे समर्थन करता है, पर परिवर्तित करने के लिए उम्मीद है। दीवार का समय प्रभावित नहीं होता है, यह RTC का उपयोग करता है।आपको शायद प्रदर्शन काउंटर का उपयोग करना बंद कर देना चाहिए, जब तक आप कुछ (5-50) मिलीसेकंद के कभी-कभी चरण समायोजन के लायक बर्दाश्त नहीं कर सकते हैं, और लगातार चरणबद्ध समायोजन करने के लिए कुछ गणित करने के इच्छुक हैं, जो लगातार या आवधिक रूप से फिर से सामान्यीकृत करके रिपोर्ट प्रदर्शन काउंटर आवृत्ति और आरटीसी कम-रिज़ॉल्यूशन समय के आधार पर प्रदर्शन काउंटर मान (आप अपने आवेदन की अंतिम ज़रूरतों के आधार पर उच्च-रिज़ॉल्यूशन टाइमर से यह मांग कर सकते हैं, या उच्च-रिज़ॉल्यूशन टाइमर से असीमित रूप से कर सकते हैं।)

1

आप कोशिश कर सकते हैं .NET से Stopwatch कक्षा का उपयोग करने के लिए, यह आपकी समस्या से मदद कर सकता है क्योंकि यह इस कम-लीवर सामग्री से निकलता है।

यह देखने के लिए IsHighResolution प्रॉपर्टी का उपयोग करें कि टाइमर उच्च-रिज़ॉल्यूशन प्रदर्शन काउंटर पर आधारित है या नहीं।

नोट: एक मल्टीप्रोसेसर कंप्यूटर पर, यह कोई फर्क नहीं पड़ता जो प्रोसेसर धागा पर चलता है। हालांकि, BIOS या हार्डवेयर एब्स्ट्रक्शन लेयर (एचएएल) में कीड़े के कारण, आप विभिन्न प्रोसेसर पर अलग-अलग समय के परिणाम प्राप्त कर सकते हैं। प्रोसेसर धागे के लिए एफ़िनिटी निर्दिष्ट करने के लिए, प्रक्रिया थ्रेड का उपयोग करें .. :: प्रोसेसरएफ़िनिटी विधि।

0

अंधेरे में बस एक शॉट।

मेरे घर पीसी पर मुझे "एआई एनओएस" या बीआईओएस में सक्षम कुछ ऐसा होता था। मुझे संदेह है कि यह QueryPerformanceCounter/QueryPerformanceFrequency APIs को खराब कर देता है क्योंकि यद्यपि सिस्टम घड़ी सामान्य दर पर चलती है, और सामान्य ऐप्स पूरी तरह से दौड़ते हैं, सभी पूर्ण स्क्रीन 3 डी गेम लगभग 10-15% बहुत तेजी से चलते हैं, उदाहरण के लिए, संवाद की आसन्न रेखाएं एक दूसरे पर यात्रा करने के लिए एक खेल में।

0

मुझे डर है कि आप कह सकते हैं कि "मुझे यह समस्या नहीं होनी चाहिए" जब आप QueryPerformance * का उपयोग कर रहे हैं - जबकि दस्तावेज़ बताता है कि QueryPerformanceFrequency द्वारा लौटाया गया मान निरंतर है, व्यावहारिक प्रयोग से पता चलता है कि यह वास्तव में है 'टी।

हालांकि आप क्यूपीसी को कॉल करते समय भी क्यूपीएफ को कॉल नहीं करना चाहते हैं। प्रैक्टिस में हमने पाया कि समय-समय पर (हमारे मामले में एक बार) क्यूपीएफ को ताजा मूल्य प्राप्त करने के लिए बुलाया गया टाइमर विश्वसनीय प्रोफाइलिंग के लिए पर्याप्त रूप से सिंक्रनाइज़ किया गया।

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

विशेष रूप से मनमाने ढंग से CPU 0 पर लॉक नहीं करते हैं, क्योंकि आप गारंटी दे सकते हैं कि कुछ अन्य बुरी तरह से कोड किए गए एप्लिकेशन ने भी ऐसा किया है, और फिर दोनों एप्लिकेशन CPU 0 पर CPU समय पर लड़ेंगे जबकि CPU 1 (या 2 या 3) निष्क्रिय बैठो यादृच्छिक रूप से उपलब्ध CPUs के सेट से चुनें और आपके पास कम से कम एक लड़ने का मौका है कि आप एक अधिभारित CPU पर लॉक नहीं हैं।

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