2009-10-27 146 views
0

我比較下面的代碼在C + +和C#和C#(單聲道2.4)似乎更快。 C++代碼有什麼問題嗎?C#散列表與C++散列表

#include <map> 
#include <string> 
#include <iostream> 
#include <ext/hash_map> 
#include <boost/any.hpp> 

int main() 
{ 
    //std::map<long, long> m; 
    // hash_map is a little bit faster 
    __gnu_cxx::hash_map<long, long> m; 

    for(long i = 0; i < 1000000; ++i) 
    { 
     m[i] = i; 
    } 

} 

和C#

using System; 
using System.Collections; 

public int Main() 
{ 
    Hashtable m = new Hashtable(); 

    for(long i = 0; i < 1000000; ++i) 
    { 
     m[i] = i; 
    } 

} 

C#代碼實際上是兩倍的速度在同一臺機器上。

$ time ./a.out 

real 0m1.028s 
user 0m0.986s 
sys  0m0.041s 

$ time mono test.exe 

real 0m0.603s 
user 0m0.732s 
sys  0m0.090s 
+5

您是否在開啓優化的情況下編譯了C++代碼? – csl 2009-10-27 23:19:06

+0

另請注意,初始哈希映射大小可能不同。例如,如果C#較大,而C++版本較低,則可能很容易看到很大的差異。 – csl 2009-10-27 23:20:08

+1

你有沒有試過Boost.Unordered? – Cogwheel 2009-10-27 23:20:49

回答

8

您需要編譯C++代碼並打開編譯器優化以進行公平比較。否則,你正在比較蘋果調試版本—編譯器甚至不會嘗試發出快速代碼。

在海灣合作委員會這將是-O3標誌,開始。

+2

ooooops !!!!它訣竅:真0m0.207s 用戶0m0.162s sys 0m0.044s – pablo 2009-10-27 23:39:49

4

的幾點思考:

  • 你比較單對升壓
  • 哪些優化(默認與否)設置你使用單聲道和C++?
  • 什麼是C#和C++版本的初始/默認哈希表大小?
  • 您是否嘗試過與其他C++哈希映射進行比較,如the sparse hash table
  • 請記住,不僅要看真實時間,但實際使用的CPU時間。
+0

我想知道Boost有多快。沒有爲Mono和C++啓用任何優化。不知道桌子的大小,我必須檢查。考慮其他哈希表正是我想要做的。是的,但即使是真正的用戶對Mono來說也更好。 – pablo 2009-10-27 23:27:38

+0

如果Boost更快,我會感到驚訝。我認爲過去幾年裏hash_map的實現並沒有太大的改進。 (順便說一句,你的Linux設置可能有std :: tr1 :: unordered_map,這是另一個哈希容器實現...) – Joe 2009-10-27 23:59:19