单临界区管理和多临界区管理的效率对比
测试代码:
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倍, 大家可以不用在意多个临界区的开销问题, 可以使用对象池解决开销问题
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
