Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Производительность boost::io_service::strand

Автор вопроса: Johannes GererОтветов: 2

Я использую boost::io_service для создания пула потоков, который выполняет вычислительные задания параллельно. Некоторые задания не могут выполняться одновременно, что, как мне кажется, является идеальным применением boost::io_service::strand. Поскольку порядок, в котором выполняются последовательные задания, не имеет значения, я спрашиваю, какой из двух способов использования цепочки мне следует использовать:

strand.post(bind(jobA...));

or

io_service.post(strand.wrap(bind(jobA...)))

Если я правильно понимаю документы boost, первая версия гарантирует, что задания будут выполняться в том же порядке, в котором они были опубликованы, тогда как вторая версия не дает никаких гарантий.

У меня вопрос: какой из них быстрее?

multithreadingboost-threadboost-asio

Ответы

Ответ 1 · рейтинг 2 · Sean

Вы можете использовать два метода, описанных выше, взаимозаменяемо, и это приведет к идентичным результатам. Я очень сомневаюсь, что есть какая-либо разница в производительности, но если она есть, то она связана с накладными расходами на вызовы двух функций (strand.post и io_service.post), но не с фактическим выполнением io_service, поскольку они оба делают одно и то же под капотом и имеют одинаковый путь исполнения.

Я предполагаю, что io_service.post() требует на несколько тактовых циклов меньше, но в то же время я также предполагаю, что такие микрооптимизации так же заметны в вашем приложении, как помехи от солнечного излучения и необходимость повторного выполнения инструкций ЦП. Я даже не знаю, настоящее это явление или нет, но это звучало круто, когда я пытался придумать многословный способ сказать "не беспокойся об этом". Если на самом деле есть разница в производительности, пожалуйста, поделитесь тестами. *закатывает глаза на себя*

Ответ 2 · рейтинг 1 · Steve Townsend

Лично я сомневаюсь, что конечная разница в производительности заметна в вашей конечной системе, но простота в сочетании с функциональной достаточностью говорит в пользу варианта 1.

Это более понятно, и использование маршрута io_service не дает вам никаких дополнительных функций, хотя и необходимо, поскольку вы выполняете косвенное обращение через один дополнительный уровень - io_service - добавляя дополнительные строки кода, которые должны быть выполнены.

документы для strand::post ясно, что использование этого метода уже обеспечивает необходимые поведенческие гарантии как на io_service, так и на strand уровнях.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы