key word:std::mutex、std::atomic、benchmark、performance
原文作者:@玄冬Wong
测试案例:8个线程分别执行1250万次累加和累减,累加的最终结果为10亿,累减的最终结果为0。
/************************************************************************/ /*测试std::mutex和std::atomic的性能对比 */ /************************************************************************/ #include <windows.h> #include <iostream> #include <time.h> #include <thread> #include <list> #include <atomic> #include <mutex> #define LOOP_COUNT 12500000 #define THREAD_COUNT 8 std::atomic<unsigned int>* atomic_array; std::mutex m; unsigned int* int_array; void atomic_fun() { for (int i = 0; i < LOOP_COUNT; i++) { atomic_array[0]++; atomic_array[1]--; } } void mutex_fun() { for (int i = 0; i < LOOP_COUNT; i++) { { std::unique_lock<std::mutex> lk(m); int_array[0]++; } { std::unique_lock<std::mutex> lk(m); int_array[1]--; } } } void test(void (*func)()) { atomic_array = new std::atomic<unsigned int>[2]; atomic_array[0] = 0; atomic_array[1] = LOOP_COUNT * THREAD_COUNT; int_array = new unsigned int[2]; int_array[0] = 0; int_array[1] = LOOP_COUNT * THREAD_COUNT; std::thread** tarray = new std::thread*[THREAD_COUNT]; clock_t start = clock(); for (int i = 0; i < THREAD_COUNT; i++) { tarray[i] = new std::thread(func); } for (int i = 0; i < THREAD_COUNT; i++) { tarray[i]->join(); } clock_t end = clock(); printf("cost:%dms\n", end - start); for (int i = 0; i < THREAD_COUNT; i++) { delete tarray[i]; } delete[] tarray; } int main(char* args, int size) { //为了排除测试程序的无关因素,测试时只开启一个:blocking或者nonblocking。 /*test(&atomic_fun); printf("[atomic]0:%d 1:%d\n", atomic_array[0], atomic_array[1]);*/ test(&mutex_fun); printf("[mutex]0:%d 1:%d\n", int_array[0], int_array[1]); }
两种接口测试分别跑了两次,结果如下
atomic测试结果
cost:5938ms
0:100000000 1:0
cost:5889ms
0:100000000 1:0
mutex测试结果
cost:10670ms
0:100000000 1:0
cost:11103ms
0:100000000 1:0
结论:atomic的性能比mutex高一倍,不过C++11中的mutex性能已经优化很好了,旧版编译器中mutex性能差不多比atomic低一个数量级。
测试环境:
windows 10 pro x64
VS2015企业版 update2,release x64
CPU:i7二代移动版