Мьютекс Std или усиление мьютекса? Что предпочтительнее?

var valid = ((" " + input + " ").split(",").length == 22);

или ...

var valid = 21 == (function(input){
    var ret = 0;
    for (var i=0; i<input.length; i++)
        if (input.substr(i,1) == ",")
            ret++;
    return ret
})();

Будет работать лучше, чем ...

var valid = (/^([^,]*,){21}[^,]*$/).test(input);
0
задан seilena 13 July 2018 в 08:06
поделиться

4 ответа

@ std::mutex для меня каждый раз, потому что @Henri утверждает, что это (очевидно) часть стандарта C ++, поэтому вы можете полагаться на ее доступность повсюду.

Используя boost, на другой стороны, означает, что вы должны ссылаться на библиотеку boost. Хотя это широко доступно и предлагает ряд удобных дополнительных функций, он довольно тяжелый, и вы не хотели бы тянуть его только для этого.

Кроме того, std::mutex может быть быстрее. Кросс-платформенный характер повышения означает, что вещи, которые полагаются на поддержку ОС (включая мьютексы), могут иногда быть менее эффективными. Но это не было основным фактором в моем мышлении.

Но если измерение производительности важно для вас, вы должны запустить свой собственный тест. Вы можете сделать это (примерно) через (скажем) Wandbox - они поддерживают библиотеку boost.

0
ответ дан Paul Sanders 17 August 2018 в 13:26
поделиться

Фокус Boost пытается использовать новые методы и внедрять новые возможности. В центре внимания стандарта C ++ указаны требования таким образом, что (в большинстве случаев) можно реализовать портативно. Ряд возможностей от boost нашли свой путь в стандарт C ++, но часто менялись в этом переходе - для улучшения переносимости, иногда повышения надежности и т. Д.

Если ваша реализация (компилятор и библиотека ) - это C ++ 11 или более поздняя версия, и вы намерены не переносить старые версии, а затем использовать std::mutex. Это часть стандарта, начиная с 2011 года, поэтому предпочтительнее. Не нужно полагаться на сторонние библиотеки. Вам понадобится только увеличение, если вам нужны дополнительные эффекты повышения эффективности, которые не поддерживаются стандартом C ++ (что означает другие вещи, кроме mutex).

Некоторые исключения из вышеизложенного: есть некоторые особенности повышения (включая связанные с потоками и мьютексами), которые не попали в стандарт C ++ и некоторые функции в стандарте C ++, которые не находятся в режиме boost.

Если вам нужно использовать (или поддержку или порт к) более старой реализации, а затем рассмотрим использование boost::mutex. В большинстве случаев вам потребуется установить версию boost отдельно с выбранной вами реализацией (некоторые версии компилятора поставляются с версией boost, но не полагаются на нее). Если нет версии boost, которая работает с вашим компилятором / библиотекой, тогда (чтобы указать очевидное) вы не сможете использовать boost::mutex.

Boost имеет библиотеку потоков (которая включает mutex), начиная с версии 1.25.0, которая датируется с конца 2001 года. Что предлагает boost - это вариант, если ваш компилятор не старше (приблизительное предположение) в начале 2000-х годов.

Если вам нужно поддерживать реализация, которая значительно старше, чем в начале 2000-х годов, вам может быть не повезло с помощью boost::mutex, и вам нужно будет прибегнуть к другим библиотекам / фреймворкам или получить грязные записи кода, специфичного для ОС.

0
ответ дан Peter 17 August 2018 в 13:26
поделиться

В качестве выбора по умолчанию вам следует предпочесть std :: anything , чтобы повысить :: samething , потому что он является частью стандартной библиотеки и, следовательно, более переносим, ​​поскольку он не ввести внешнюю зависимость.

Вы вообще не можете сравнивать std::mutex и boost::mutex, потому что нет один и только std::mutex, его реализация зависит от стандартного используемой библиотеки, которая обычно является частью вашей инструментальной цепочки.

Возможно, будет случай, когда вы обнаружите использование эмпирических доказательств того, что std::mutex, который вы используете, в некотором отношении «хуже», чем boots::mutex. В этом случае можно было бы быть разумным переключиться на него, но только если это действительно оправдано, и у вас есть фактическое свидетельство (например, измерение производительности). Даже тогда это выглядит как последнее средство. Возможно, было бы лучше переключиться на другую стандартную реализацию библиотеки или на другую инструментальную цепочку или обновить ваш текущий, если это возможно.

1
ответ дан r3mus n0x 17 August 2018 в 13:26
поделиться

Рассмотрите boost как лабораторию для создания прототипов std. Многие объекты std были первоначально реализованы при повышении. Разница в том, что std заботится о согласованности и передовой совместимости, в то время как boost нацеливает новые горизонты. Ничто не препятствует применению изменений в будущих версиях, но также дает ответы на большее количество вопросов, чем std. Мои личные предпочтения сначала std - когда это возможно - и увеличивать следующее - когда это необходимо. Я вообще избегаю pre c ++ 11 платформ, если я не вынужден столкнуться.

0
ответ дан Red.Wave 17 August 2018 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: