Почему boost:: mutex быстрее, чем std:: mutex с vs2013?

Сегодня я написал код для проверки производительности мьютекса.

Это версия 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 намного сложнее, я уже пытался понять это, но я не мог понять, почему это так сложно? есть ли более быстрый способ?

Ответ 1

Кажется, что stl::mutex может использовать только системные вызовы, которые занимают много накладных расходов; но boost::mutex реализует по крайней мере некоторые из его функциональных возможностей программно, т.е. пытается избежать системных вызовов, когда это возможно, что послужило бы причиной проверки try _interlockedbittestandset до WaitForSingleObject.

Я не знаю фактических внутренних компонентов MS stl, но я видел различия в производительности, подобные этому, из примеров в классе операционных систем.

Ответ 2

Тест проверяет только условие блокировки разблокированного мьютекса без каких-либо утверждений из других потоков.

Предположим, что мьютекс заблокирован. После первоначальной попытки повышения, было бы лучше, если нить будет вращаться или блокироваться? Это действительно зависит от приложения. И, возможно, stl работает лучше при большой нагрузке.

Когда времена требуют высокоэффективного мьютекса, стоит искать свободную от блокировки альтернативу для достижения тех же целей.