单临界区管理和多临界区管理的效率对比

测试代码:

struct test1 {
	int value;
	CRITICAL_SECTION _critical;				//临界区
	test1() : value(0) {
		// 初始化临界区
		InitializeCriticalSection(&_critical);
	}
	~test1() {
		// 释放临界区
		DeleteCriticalSection(&_critical);
	}
	void add() {
		raii temp(&_critical);
		++value;
	}
	void sub() {
		raii temp(&_critical);
		--value;
	}
};

struct test2 {
	int value;
	test2() : value(0) {
	}
	~test2() {
	}
	void add() {
		++value;
	}
	void sub() {
		--value;
	}
};

int main() {
	auto timer = &time_heap::instance();
	std::unordered_map<SOCKET, test1> t1;	//客户端信息
	std::unordered_map<SOCKET, test2> t2;	//客户端信息
	int num = 1000000;
	for (int i = 0; i < num; ++i) {
		t1[i] = *new test1;
		t2[i] = *new test2;
	}
	auto _thread_pool = &thread_pool::instance();
	auto start_time = timer->get_ms();
	std::atomic<int> complete_num(0);
	for (int i = 0; i < 5; ++i) {
		_thread_pool->add([&] {
			for (int j = 0; j < num; ++j) {
				t1[j].add();
			}
			if (++complete_num == 10) {
				printf("消耗时间(毫秒):%I64d\n", timer->get_ms() - start_time);
			}
			}
		);
	}
	for (int i = 0; i < 5; ++i) {
		_thread_pool->add([&] {
			for (int j = 0; j < num; ++j) {
				t1[j].sub();
			}
			if (++complete_num == 10) {
				printf("消耗时间(毫秒):%I64d\n", timer->get_ms() - start_time);
			}
			}
		);
	}
	//CRITICAL_SECTION _critical;				//临界区
	 初始化临界区
	//InitializeCriticalSection(&_critical);
	//for (int i = 0; i < 5; ++i) {
	//	_thread_pool->add([&] {
	//		for (int j = 0; j < num; ++j) {
	//			raii temp(&_critical);
	//			t2[j].add();
	//		}
	//		if (++complete_num == 10) {
	//			printf("消耗时间(毫秒):%I64d\n", timer->get_ms() - start_time);
	//		}
	//		}
	//	);
	//}
	//for (int i = 0; i < 5; ++i) {
	//	_thread_pool->add([&] {
	//		for (int j = 0; j < num; ++j) {
	//			raii temp(&_critical);
	//			t2[j].sub();
	//		}
	//		if (++complete_num == 10) {
	//			printf("消耗时间(毫秒):%I64d\n", timer->get_ms() - start_time);
	//		}
	//		}
	//	);
	//}
}

里面有我改写的网络上的线程池和一些其他的类,所以在各位的电脑上直接运行不了,如果想运行可以自己改一下。

单临界区:

多临界区:

耗时:

平均值相差5-6倍, 大家可以不用在意多个临界区的开销问题, 可以使用对象池解决开销问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值