key word:std::mutex、std::atomic、benchmark、performance
测试案例: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二代移动版