我已經做了幾年的c#現在,我正在嘗試學習一些新的東西。所以我決定看看C++,以不同的方式瞭解編程。c#to C++ dictionary unordered_map results
我一直在做大量的閱讀,但我今天剛開始寫一些代碼。
在我的Windows 7/64位機,運行VS2010,我創建了兩個項目: 1)C#項目,讓我寫的東西,我習慣的方式。 2)一個C++「makefile」項目,讓我玩耍,試圖實現同樣的事情。據我所知,這不是一個.NET項目。
我試圖用10K值填充字典。出於某種原因,C++的速度要慢幾個數量級。
下面是c#下面。注意我把一個功能的時間測量之後,以確保它沒有被「優化」掉由編譯器:
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 input;
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歪曲的結果。我已經將項目設置爲釋放,並通過了C++項目的「屬性」選項卡,使所有聽起來像它會使它變得更快。將平臺更改爲x64,但我不確定這是否解決了他的問題。我對編譯器選項沒有經驗,也許你們有更多的線索?
呵呵,結果:c#:0.32ms C++:8.26ms。這有點奇怪。我是否誤解了什麼.Quad是什麼意思?我從網上的某個地方複製了C++計時器代碼,通過了所有的boost安裝和include/libfile rigmarole。或者我可能在不知不覺中使用了不同的樂器?或者有一些我沒有用過的關鍵編譯選項?或者,也許C#代碼是優化的,因爲平均值是一個常量?
這裏的C++命令行,從屬性頁面級> C/C++ - >命令行: /I 「C:\用戶\卡洛斯\桌面\ boost_1_47_0」/紫/ 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:隊列
任何幫助將不勝感激,謝謝。
您是否嘗試過使用std :: map代替boost :: unordered_map? –
不要相信太多的其他答案。他對WOW64的評論完全是基於底層的,可能會對系統調用造成一定的懲罰(儘管我認爲這甚至不是很重要),但絕對不是數學。x86 FPU代碼的運行速度與WOW64一樣快,與32位處理器一樣快。答案中的其他一些事情大約有一半也是基於外部的。 –
是的,我試過地圖,然後我看到它更類似於SortedDictionary。玩過類型遊戲,沒有區別。 – Carlos