Информация об изменениях

Сообщение Re: Вопрос по boost lockfree queue от 26.04.2015 18:14

Изменено 26.04.2015 18:15 uzhas

Здравствуйте, Engler, Вы писали:

E>Есть у кого какие-нибудь идеи?


физический смысл переменной sum — сумма всех задержек по всем вброшенным объектам. эта сумма не обязана как-то быть похожей на время выполнения всего приложения, т.к. у вас не пинг-понг (то есть producer не ждет когда же consumer обработает объект). sum / consumer_count должно быть меньше времени работы всего приложения (в вашем "странном случае это 33 микросекунды меньше 1.6 сек, все окей)
sum / consumer_count — это среднее время задержки обработки одного объекта (интересующее вас число). для того, чтобы оно было точнее нужно сначала поднять потоки, а потом уже прогонять данные через систему. для этого рекомендую создать barrier на (producer_thread_count + consumer_thread_count) потоков и в функции consumer\producer в самом начале вызовать wait(), чтобы дождаться запуска всех потоков. это позволит избежать искажения собранной статистики из-за доп. времени старта каждого потока.
зы: выход из wait тоже недешев и может исказить результаты, но, надеюсь, вы уже при таком подходе получите приемленмые данные
успехов
Re: Вопрос по boost lockfree queue
Здравствуйте, Engler, Вы писали:

E>Есть у кого какие-нибудь идеи?


физический смысл переменной sum — сумма всех задержек по всем вброшенным объектам. эта сумма не обязана как-то быть похожей на время выполнения всего приложения, т.к. у вас не пинг-понг (то есть producer не ждет когда же consumer обработает объект). sum / consumer_count должно быть меньше времени работы всего приложения (в вашем "странном случае это 33 микросекунды меньше 1.6 сек, все окей)
sum / consumer_count — это среднее время задержки обработки одного объекта (интересующее вас число). для того, чтобы оно было точнее нужно сначала поднять потоки, а потом уже прогонять данные через систему. для этого рекомендую создать barrier на (producer_thread_count + consumer_thread_count) потоков и в функции consumer\producer в самом начале вызовать wait(), чтобы дождаться запуска всех потоков. это позволит избежать искажения собранной статистики из-за доп. времени старта каждого потока.
зы: выход из wait тоже недешев и может исказить результаты, но, надеюсь, вы уже при таком подходе получите приемлемые результаты
успехов