map与unordered_map效率的比较

之前在某blog看到map在非常少量数据下插入效率高于unordered_map。

自己测了一下并非如此,在设置合适的桶数的情况下,有如下结论:

1、插入效率unordered_map任何情况下均优于map,数据越多越明显。

2、遍历效率map略优于unordered_map。

补充:

1、只在 g++ 4.4.6下测试,-o2与无编译器优化结果一致。

2、没有计算rehash与计算素数的时间,因为一般在程序启动时就rehash了,所以忽略掉。

直接上代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

/// 返回大于1.5 * num的第一个素数
inline size_t get_hash_table_size(unsigned int num) {
	size_t return_num = 1.5 * num, i, j;
	while (1) {
		/// 素数判断
		j = (size_t)sqrt(return_num++);
		for (i = 2; i < j; ++i) {
			if (return_num % i == 0)
				break;
		}
		if (i == j)
			return return_num;
	}
}

long get_time_usec_gap(const timeval &start, const timeval &end)
{
	return (end.tv_sec - start.tv_sec) * 1000000 + end.tv_usec - start.tv_usec;
}

int main()
{
	cout<<"please input map size: "<>map_size;

	if (map_size <= 0) {
		return -1;
	}

	set random_nums_set;

	srand(time(0));
	for (int i = 0; i < map_size; ) {
		int random_nums = rand();
		if (0 == random_nums_set.count(random_nums)) {
			random_nums_set.insert(random_nums);
			++i;
		}
	}

	map map_test;
	unordered_map unordered_map_test;
	unordered_map_test.rehash(get_hash_table_size(map_size));

	struct timeval t_start,t_end;
	gettimeofday(&t_start, 0);
	for (auto it = random_nums_set.begin(); it != random_nums_set.end(); ++it) {
        map_test.insert(std::make_pair(*it, 0));
	}
	gettimeofday(&t_end, 0);
	cout<<"map insert time:"<


你可能感兴趣的:(C/C++)