2012-01-26 18 views
5

मैं लिनक्स से विंडोज तक सी ++ कोड पोर्ट कर रहा हूं। इस प्रक्रिया के दौरान मुझे पता चला है कि निम्न पंक्ति (ठीक उसी हार्डवेयर पर) 10 बार Windows के तहत धीमी लेता है ~:विंडोज बनाम लिनक्स मेमोरी आवंटन/std :: सूची कन्स्ट्रक्टर प्रदर्शन

list<char*>* item = new list<char*>[160000]; 

Windows पर यह ~ 10ms लेता है, जबकि लिनक्स पर यह ~ 1ms लेता है। ध्यान दें कि यह औसत समय है। इस पंक्ति को चलाने से 100 बार विंडोज़ पर ~ 1 सेकंड लगता है।

यह Win32 और x64 दोनों पर होता है, दोनों संस्करण रिलीज में संकलित किए जाते हैं, और गति QueryPerformanceCounter (विंडोज) और gettimeofday (लिनक्स) के माध्यम से मापा जाता है।

लिनक्स कंपाइलर जीसीसी है। विंडोज कंपाइलर वीएस -2010 है।

कोई विचार यह क्यों हो सकता है?

+3

मैं देख रहा हूँ एक flamewar बढ़ती ... वैसे भी, तो आप शायद एक पाश या तो में सामान करना चाहिए, इन नंबरों शायद मतलब यह नहीं है जितनी अधिक चीजें चल रही हैं, उतनी ही 10 एमएमएस आसानी से परेशान होती है। कम से कम कुछ सेकंड की मात्रा में मापें। लेकिन फिर भी मुझे लगता है कि विंडोज़ पर स्मृति आवंटित करने के लिए तेह डिफॉल तरीका धीमा है। बस थोड़ा सा खेलें और इसे एक ऐसे पैटर्न की तरह बनाएं जो आप अपने प्रोग्राम में उपयोग करेंगे। – PlasmaHH

+10

@EdHeal: हमने टाइम मशीन तय की है। अब आप 1 99 8 में यात्रा कर सकते हैं और वहां खुशी से रह सकते हैं। –

+0

@ssg यकीन नहीं है। मेरी ओर से मैंने क्यूटी में 5 एमएमएस-रेज़ोल्यूशन टाइमर रखने और विंडोज़ पर ऐसा करने का कोई तरीका नहीं रखने का अपना सर्वश्रेष्ठ प्रयास किया। – UmNyobe

उत्तर

10

यह लाइब्रेरी कार्यान्वयन का एक मुद्दा हो सकता है। मैं ज्यादातर मामलों में एक एकल आवंटन उम्मीद होती है, list कुछ भी आवंटन नहीं के लिए डिफ़ॉल्ट निर्माता के साथ। तो क्या आप को मापने के लिए कोशिश कर रहे हैं list के डिफ़ॉल्ट निर्माता (जो 160000 निष्पादित किया जाता है) की लागत है।

मैं कहता हूं "मापने की कोशिश कर रहा है", क्योंकि छोटे माप वाले किसी भी माप को निष्पादन समय मापने से अधिक घड़ी की जिटर और रिज़ॉल्यूशन मापते हैं। आपको इसे निष्पादित करने के लिए अक्सर कुछ सेकंड के रनटाइम प्राप्त करने के लिए इसे लूप में रखना चाहिए। और जब आप ऐसा करते हैं , आप सावधानी बरतने सुनिश्चित करना है कि संकलक कुछ भी बाहर अनुकूलन नहीं करता की जरूरत है।

और लिनक्स के तहत, आप कम से कम clock() का उपयोग करना मापना चाहते हैं; दीवार घड़ी समय आप gettimeofday से मिलता है और क्या एक ही समय में होने का क्या होता है पर बहुत निर्भर है। (हालांकि Windows के तहत clock() का उपयोग न करें, । विंडोज कार्यान्वयन टूटी हुई है।)

+1

मैं मानता हूं, यह 'std :: list' के कन्स्ट्रक्टर की लागत को माप रहा है, स्मृति आवंटन नहीं। इसके अलावा, प्लेसमेंट-'नया [] '* के बाद आवंटन का उपयोग करके अलग-अलग दोनों को मापना मुश्किल होगा। –

+0

सत्य साबित हुआ, सूची <> ctor वह जगह है जहां अधिकांश समय चला गया। –

2

मुझे लगता है कि इस निर्देश में दोनों ओएस (कुछ भी ध्यान दिए बिना) में कम समय लगता है। इस मामले में ऐसा कुछ समय लगता है कि आप वास्तव में अपने टाइमर के संकल्प को माप सकते हैं।

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