Сегодня я написал код для проверки производительности мьютекса.
Это версия boost (1.54), скомпилированная на vs2010 с оптимизацией O2:
boost::mutex m;
auto start = boost::chrono::system_clock::now();
for (size_t i = 0; i < 50000000; ++i) {
boost::lock_guard<boost::mutex> lock(m);
}
auto end = boost::chrono::system_clock::now();
boost::chrono::duration<double> elapsed_seconds = end - start;
std::cout << elapsed_seconds.count() << std::endl;
И это версия std, скомпилированная на VS2013, с оптимизацией O2:
std::mutex m;
auto start = std::chrono::system_clock::now();
for (size_t i = 0; i < 50000000; ++i) {
std::lock_guard<std::mutex> lock(m);
}
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
std::cout << elapsed_seconds.count() << std::endl;
Немного отличается, но делает то же самое. Мой процессор - это Intel Core i7-2600K, моя ОС - 64-разрядная Windows 7, и результат: 0.7020s против 2.1684s, 3.08 раз.
boost:: mutex попробует _interlockedbittestandset сначала, и если это не удастся, большой сыр WaitForSingleObject будет вторым, это просто понять.
Кажется, что std:: mutex VS2013 намного сложнее, я уже пытался понять это, но я не мог понять, почему это так сложно? есть ли более быстрый способ?