Zrobiłem kilka lat C# teraz i próbuję nauczyć się nowych rzeczy. Postanowiłem więc rzucić okiem na C++, aby poznać programowanie w inny sposób.C# do C++ słownik do niezamkniętych_map wyników
Robiłem mnóstwo czytania, ale właśnie zacząłem dzisiaj pisać jakiś kod.
Na moim komputerze z Windows 7/64 bit, z uruchomionym VS2010, stworzyłem dwa projekty: 1) Projekt C#, który pozwala mi pisać rzeczy tak, jak jestem przyzwyczajony. 2) Projekt "makefile" w C++, który pozwala mi się bawić, próbując zaimplementować to samo. Z tego co rozumiem, to NIE jest projekt .NET.
Mam do wypełnienia słownik z wartości 10K. Z jakiegoś powodu C++ jest wolniejsze o rząd wielkości.
Oto C# poniżej. Uwaga umieścić w zależności od pomiaru czasu, aby upewnić się, że nie został „zoptymalizowany” z dala przez kompilator:
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
Oto C++, nie wiele myśli poszła do niego (starając się dowiedzieć, prawda?) int wejście;
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
Teraz niektóre zastrzeżenia. I managed to find this related SO question. Jeden z chłopaków napisał długą odpowiedź, w której WOW64 przekrzywił wyniki. Przygotowałem projekt do wydania i przejścia przez zakładkę "właściwości" projektu C++, dzięki czemu wszystko, co zabrzmiało tak, mogłoby przyspieszyć działanie. Zmieniono platformę na x64, ale nie jestem pewien, czy to rozwiązuje problem wow64. Nie mam takich doświadczeń z opcjami kompilatora, może masz więcej pojęcia?
Aha, i wyniki: C#: 0.32ms C++: 8.26ms. To trochę dziwne. Czy źle zinterpretowałem coś o czym .Quad znaczy? Skopiowałem kod zegara C++ z dowolnego miejsca w Internecie, przechodząc przez całą instalację doładowania i dołączając/libfile rigmarole. A może nieświadomie używam różnych instrumentów? Czy jest jakaś krytyczna opcja kompilacji, której nie używałem? A może kod C# jest zoptymalizowany, ponieważ średnia jest stała?
Oto linia C++ polecenia z posesji PAGE-> C/C++ -> Wiersz poleceń: /I "C: \ Users \ Carlos \ Pulpit \ boost_1_47_0"/Zi/nologo/W3/WX-/MP/Ox/Oi/Ot/GL/D "_MBCS"/Gm-/EHsc/GS-/Gy-/arch: SSE2/fp: fast/Zc: wchar_t/Zc: forScope/Fp "x64 \ Release \ MakeTest .pch "/ Fa" x64 \ Release \ "/ Fo" x64 \ Release \ "/Fd"x64\Release\vc100.pdb"/Gd/errorReport: kolejka
Każda pomoc będzie doceniona, dzięki.
Czy próbowałeś std :: map zamiast boost :: unordered_map? –
Nie ufajcie zbytnio tej drugiej odpowiedzi. Jego komentarz na temat WOW64 w szczególności jest całkowicie nieoparty, może być kara za wywołania systemowe (choć nie sądzę, że jest to znaczące), ale zdecydowanie nie dla matematyki.Kod FPU x86 działa tak samo szybko z WOW64, jak z procesorem 32-bitowym. Mniej więcej połowa innych rzeczy w tej odpowiedzi jest również poza bazą. –
Tak, próbowałem map, potem czytałem, że jest bardziej podobny do SortedDictionary. Miałem zabawę z typami, bez różnicy. – Carlos