[C++11]std::mutex和std::atomic的性能测试对比(benchmark)

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二代移动版

猜你喜欢

转载自aigo.iteye.com/blog/2292828