Я использую boost::io_service для создания пула потоков, который выполняет вычислительные задания параллельно. Некоторые задания не могут выполняться одновременно, что, как мне кажется, является идеальным применением boost::io_service::strand. Поскольку порядок, в котором выполняются последовательные задания, не имеет значения, я спрашиваю, какой из двух способов использования цепочки мне следует использовать:
strand.post(bind(jobA...));
or
io_service.post(strand.wrap(bind(jobA...)))
Если я правильно понимаю документы boost, первая версия гарантирует, что задания будут выполняться в том же порядке, в котором они были опубликованы, тогда как вторая версия не дает никаких гарантий.
У меня вопрос: какой из них быстрее?
Ответ 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 уровнях.