मैंने कुछ वर्षों के सी # अब किया है, और मैं कुछ नई चीजें सीखने की कोशिश कर रहा हूं। तो मैंने प्रोग्रामिंग को एक अलग तरीके से जानने के लिए, सी ++ पर एक नज़र डालने का फैसला किया।सी # से सी ++ शब्दकोश unordered_map परिणामों के लिए
मैं पढ़ने के भार कर रहा हूं, लेकिन मैंने आज कुछ कोड लिखना शुरू कर दिया है।
मेरी विंडोज 7/64 बिट मशीन पर, वीएस -2010 चल रहा है, मैंने दो परियोजनाएं बनाई: 1) एक सी # प्रोजेक्ट जो मुझे चीजों को लिखने की अनुमति देता है। 2) एक सी ++ "मेकफ़ाइल" प्रोजेक्ट जो मुझे एक ही चीज़ को लागू करने की कोशिश कर रहा है। जो मैं समझता हूं उससे, यह एक .NET प्रोजेक्ट नहीं है।
मुझे 10K मानों के साथ एक शब्दकोश को पॉप्युलेट करने का प्रयास करना पड़ा। किसी कारण से, सी ++ तीव्रता के आदेश धीमा है।
यहां नीचे सी # है। नोट मैं समय माप के बाद एक समारोह में डाल सुनिश्चित करने के लिए यह "अनुकूलित" नहीं कर रहा था दूर संकलक द्वारा:
var freq = System.Diagnostics.Stopwatch.Frequency;
int i;
Dictionary<int, int> dict = new Dictionary<int, int>();
var clock = System.Diagnostics.Stopwatch.StartNew();
for (i = 0; i < 10000; i++)
dict[i] = i;
clock.Stop();
Console.WriteLine(clock.ElapsedTicks/(decimal)freq * 1000M);
Console.WriteLine(dict.Average(x=>x.Value));
Console.ReadKey(); //Don't want results to vanish off screen
यहाँ C++, बहुत ज्यादा नहीं सोचा था कि इसे में चला गया है है (जानने की कोशिश कर, सही?) int इनपुट;
LARGE_INTEGER frequency; // ticks per second
LARGE_INTEGER t1, t2; // ticks
double elapsedTime;
// get ticks per second
QueryPerformanceFrequency(&frequency);
int i;
boost::unordered_map<int, int> dict;
// start timer
QueryPerformanceCounter(&t1);
for (i=0;i<10000;i++)
dict[i]=i;
// stop timer
QueryPerformanceCounter(&t2);
// compute and print the elapsed time in millisec
elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0/frequency.QuadPart;
cout << elapsedTime << " ms insert time\n";
int input;
cin >> input; //don't want console to disappear
अब, कुछ चेतावनी। I managed to find this related SO question. लोगों में से एक ने परिणामों का स्काईइंग WOW64 का उल्लेख करते हुए एक लंबा जवाब लिखा। मैंने प्रोजेक्ट को रिलीज़ करने के लिए सेट किया है और सी ++ प्रोजेक्ट के "गुण" टैब के माध्यम से चला गया है, जिससे सबकुछ ऐसा लगता है जो इसे तेज कर देगा। प्लेटफॉर्म को x64 में बदल दिया, हालांकि मुझे यकीन नहीं है कि वह उसके वाह 64 मुद्दे को संबोधित करता है या नहीं। मैं संकलक विकल्पों के साथ अनुभव नहीं कर रहा हूं, शायद आप लोगों के पास एक सुराग है?
ओह, और परिणाम: सी #: 0.32ms सी ++: 8.26ms। यह थोड़ा अजीब है। क्या मैंने कुछ के बारे में गलत व्याख्या की है। क्वाड का मतलब है? मैंने वेब पर किसी स्थान से सी ++ टाइमर कोड की प्रतिलिपि बनाई, सभी बूस्ट इंस्टॉलेशन के माध्यम से जाकर/libfile rigmarole शामिल किया। या शायद मैं वास्तव में अनजाने में विभिन्न उपकरणों का उपयोग कर रहा हूँ? या कुछ महत्वपूर्ण संकलन विकल्प है जिसका मैंने उपयोग नहीं किया है? या शायद सी # कोड अनुकूलित किया गया है क्योंकि औसत स्थिर है?
यहाँ C++ कमांड लाइन, संपत्ति से है पृष्ठ-> C/C++ -> कमांड लाइन: /मैं "C: \ Users \ कार्लोस \ डेस्कटॉप \ boost_1_47_0"/जि/Nologo/डब्ल्यू 3/WX-/एमपी/ऑक्स/ओई/ओटी/जीएल/डी "_एमबीसीएस"/जीएम-/ईएचएससी/जीएस-/जीई// आर्क: एसएसई 2/एफपी: फास्ट/जेडसी: wchar_t/जेडसी :स्कोप/एफपी "x64 \ रिलीज \ मेकटेस्ट .pch "/ Fa" x64 \ release \ "/ fo" x64 \ release \ "/Fd"x64\Release\vc100.pdb"/जीडी/त्रुटि रिपोर्ट: कतार
किसी भी मदद की सराहना की जाएगी, धन्यवाद।
क्या आपने boost :: unordered_map के बजाय std :: map की कोशिश की है? –
उस दूसरे उत्तर पर भरोसा मत करो। विशेष रूप से WOW64 के बारे में उनकी टिप्पणी पूरी तरह से ऑफ-बेस है, सिस्टम कॉल के लिए जुर्माना हो सकता है (हालांकि मुझे नहीं लगता कि यह भी महत्वपूर्ण है) लेकिन निश्चित रूप से गणित के लिए नहीं।x86 एफपीयू कोड 32-बिट प्रोसेसर के साथ WOW64 के साथ जितना तेज़ चलता है। उस उत्तर में लगभग आधा अन्य चीजें ऑफ-बेस भी हैं। –
हाँ, मैंने मानचित्र की कोशिश की, फिर मैंने पढ़ा कि यह SortedDictionary के समान है। प्रकार के साथ एक खेल था, कोई फर्क नहीं पड़ता। – Carlos