單臨界區管理和多臨界區管理的效率對比

測試代碼:

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倍, 大家可以不用在意多個臨界區的開銷問題, 可以使用對象池解決開銷問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章