C#散列表与C++散列表

问题描述:

我比较下面的代码在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

您需要编译C++代码并打开编译器优化以进行公平比较。否则,你正在比较苹果调试版本—编译器甚至不会尝试发出快速代码。

在海湾合作委员会这将是-O3标志,开始。

+2

ooooops !!!!它诀窍:真0m0.207s 用户0m0.162s sys 0m0.044s – pablo 2009-10-27 23:39:49

的几点思考:

  • 你比较单对升压
  • 哪些优化(默认与否)设置你使用单声道和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