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

测试代码:

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 t1;	//客户端信息std::unordered_map 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 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倍, 大家可以不用在意多个临界区的开销问题, 可以使用对象池解决开销问题


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部