std :: mutex性能相比win32 CRITICAL_SECTION [英] std::mutex performance compared to win32 CRITICAL_SECTION
问题描述
std :: mutex
与 CRITICAL_SECTION
相比的效果如何?它是否在par?
how does the performance of std::mutex
compared to CRITICAL_SECTION
? is it on par?
我需要轻量级的同步对象(不需要是一个进程间的对象)是有任何STL类接近 CRITICAL_SECTION
std :: mutex
?
I need lightweight synchronization object (doesn't need to be an interprocess object) is there any STL class that close to CRITICAL_SECTION
other than std::mutex
?
推荐答案
我做了一个非常简单的测试,根据我的测量, std :: mutex
比 CRITICAL_SECTION
I made a very simple test and according to my measurements the std::mutex
is around 50-70x slower than CRITICAL_SECTION
.
std::mutex: 18140574us
CRITICAL_SECTION: 296874us
编辑:经过一些更多的测试,证明它取决于线程数量(拥塞)和CPU核心数。通常, std :: mutex
更慢,但是多少,这取决于使用。以下是更新的测试结果(在Core i5-4228U上测试):
After some more tests it turned out it depends on number of threads (congestion) and number of CPU cores. Generally, the std::mutex
is slower, but how much, it depends on use. Following are updated test results (tested on Core i5-4228U):
Iterations: 1000000
Thread count: 1
std::mutex: 78132us
CRITICAL_SECTION: 31252us
Thread count: 2
std::mutex: 687538us
CRITICAL_SECTION: 140648us
Thread count: 4
std::mutex: 1031277us
CRITICAL_SECTION: 703180us
Thread count: 8
std::mutex: 86779418us
CRITICAL_SECTION: 1634123us
Thread count: 16
std::mutex: 172916124us
CRITICAL_SECTION: 3390895us
产生这个输出。编译与Visual Studio 2012,默认项目设置,Win32发行版配置。请注意,这个测试可能不完全正确,但它让我想了两次,我把代码从使用 CRITICAL_SECTION
到 std :: mutex
。
Following is the code that produced this output. Compiled with Visual Studio 2012, default project settings, Win32 release configuration. Please note that this test may not be perfectly correct but it made me think twice before switching my code from using CRITICAL_SECTION
to std::mutex
.
#include "stdafx.h"
#include <Windows.h>
#include <mutex>
#include <thread>
#include <vector>
#include <chrono>
#include <iostream>
const int g_cRepeatCount = 1000000;
const int g_cThreadCount = 16;
double g_shmem = 8;
std::mutex g_mutex;
CRITICAL_SECTION g_critSec;
void sharedFunc( int i )
{
if ( i % 2 == 0 )
g_shmem = sqrt(g_shmem);
else
g_shmem *= g_shmem;
}
void threadFuncCritSec() {
for ( int i = 0; i < g_cRepeatCount; ++i ) {
EnterCriticalSection( &g_critSec );
sharedFunc(i);
LeaveCriticalSection( &g_critSec );
}
}
void threadFuncMutex() {
for ( int i = 0; i < g_cRepeatCount; ++i ) {
g_mutex.lock();
sharedFunc(i);
g_mutex.unlock();
}
}
void testRound(int threadCount)
{
std::vector<std::thread> threads;
auto startMutex = std::chrono::high_resolution_clock::now();
for (int i = 0; i<threadCount; ++i)
threads.push_back(std::thread( threadFuncMutex ));
for ( std::thread& thd : threads )
thd.join();
auto endMutex = std::chrono::high_resolution_clock::now();
std::cout << "std::mutex: ";
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(endMutex - startMutex).count();
std::cout << "us \n\r";
threads.clear();
auto startCritSec = std::chrono::high_resolution_clock::now();
for (int i = 0; i<threadCount; ++i)
threads.push_back(std::thread( threadFuncCritSec ));
for ( std::thread& thd : threads )
thd.join();
auto endCritSec = std::chrono::high_resolution_clock::now();
std::cout << "CRITICAL_SECTION: ";
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(endCritSec - startCritSec).count();
std::cout << "us \n\r";
}
int _tmain(int argc, _TCHAR* argv[]) {
InitializeCriticalSection( &g_critSec );
std::cout << "Iterations: " << g_cRepeatCount << "\n\r";
for (int i = 1; i <= g_cThreadCount; i = i*2) {
std::cout << "Thread count: " << i << "\n\r";
testRound(i);
Sleep(1000);
}
getchar();
DeleteCriticalSection( &g_critSec );
return 0;
}
这篇关于std :: mutex性能相比win32 CRITICAL_SECTION的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!