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

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

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

or

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

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

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


person Johannes Gerer    schedule 17.06.2011    source источник


Ответы (2)


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

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

person Sean    schedule 17.06.2011
comment
Итак, вы говорите (кроме того, что это имеет значение) противоположное Стиву Таунсенду. Как вы думаете, почему на io_service.postменьше тактов? - person Johannes Gerer; 18.06.2011
comment
io_service.post(strand.wrap(bind(jobA...))) доступен в стеке, и компилятор может более легко предварительно вычислить большую часть работы во время выполнения во время компиляции. strand.post(bind(jobA...)), каким-то образом strand нужно преобразовать в соответствующий io_service. Я не думаю, что между ними есть разница в нескольких инструкциях, но в моем неизмеренном WAG я думаю, что io_service.post быстрее на нерелевантное количество циклов во всех рабочих нагрузках, где этот процесс подключен либо к диску, либо к сети. . Лучшего прироста производительности можно добиться за счет большего охлаждения серверов. :) - person Sean; 20.06.2011
comment
Ключевые слова там проще. Достаточно хороший компилятор должен компилировать оба варианта до одного и того же набора инструкций. Протестируйте и сообщите нам, если вы действительно заинтересованы в дюжине или около того инструкций. - person Sean; 20.06.2011
comment
+1 за микрооптимизацию, тестирование и отчет, оба отличные предложения. - person Sam Miller; 22.06.2011
comment
@Sean: это приводит к тем же инструкциям, поскольку один из двух методов сохраняет порядок выполнения !!! - person Johannes Gerer; 24.06.2011
comment
У вас нет контроля над тем, как io_service выполняет отправленные ему вызовы. io_service может выполнять задания в любом порядке, который считает нужным, и делает это неуказанным образом. - person Sean; 24.06.2011

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

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

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

person Steve Townsend    schedule 17.06.2011
comment
Да, во втором случае есть лишний код, но у меня вопрос: сколько стоит гарантия порядка выполнения? - person Johannes Gerer; 18.06.2011
comment
Без измерения не скажешь. Мне кажется, что это вряд ли стоит циклов, я готов поспорить, что у вас есть более важные проблемы с производительностью, о которых нужно беспокоиться в программе такого рода. - person Steve Townsend; 20.06.2011