boost :: io_service :: Strand Performance - PullRequest
1 голос
/ 17 июня 2011

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

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

или

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

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

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

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

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

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

1 голос
/ 17 июня 2011

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

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

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

...