2015-04-29 45 views
1

我正在测量从线程A发布事件到链的性能,直到链开始处理它为止。我推测,对于不同数量的接收数据包,从下面的例子中选择500或1,在接收数据包时不会影响到boost::asio::strand,因为我只是将指针传递给数组数据packets_ptr到股,我相信不涉及复制。但是,在我单独计算9999999次迭代之后,结果显示它们在不同大小之间甚至不相似。对于1的大小,它总是在1〜9微秒之间,对于500的大小,在50〜85微秒之间。boost :: asio :: strand post方法的性能

//Socket Thread  
int packet_count = recvmmsg(mcast_fd, packets, 500, 0, NULL); //OR 
    int packet_count = recvmmsg(mcast_fd, packets, 1, 0, NULL); 
    ..... 
    packets_recv_time = timer.getTime(); 
    strand_.post(boost::bind(&handler_class::process_package_method, this, packets_ptr, packets_recv_time, num_of_packets)); 
    ..... 

//io_service thread 
    handler_class::process_package_method(...) 
    { 
    prcess_beign_time = timer.getTime(); 
    Measure_time = prcess_beign_time - packets_recv_time; 
    } 

回答

3

推定是正确的。但是,分析是错误的。时间戳不测量​​的性能。相反,他们测量完成处理程序发布到strand的时间以及io_service开始执行完成处理程序的时间,该处理程序受多种因素(线程,当前工作负载,当前strand待办事项等)的影响。

要测量的strand::post()的性能,一个需要前和后后,立即取样:

auto t1 = clock::now(); 
strand_.post(...); 
auto t2 = clock::now(); 

当处理程序被发布到一个strand,它可以被复制或在执行之前移动。因此,如果用户提供的处理程序的复制/移动结构具有统一的成本,那么strand::post()的性能将是相当稳定的。可以在以下情况下引入差异:

  • 处理程序的复制/移动构造没有统一的成本。例如,如果vector绑定到处理程序,则复制构造将受到正在复制的元素数量的影响。
  • 有多个线程同时更改strand的内部。由于strand提供了线程安全性,所以在strand::post()内可能会发生线程争用。

在原始代码中,从boost::bind()返回的仿函数具有相同的类型,而不管接收到的消息数量多少。此外,它及其约束论据具有统一的复制/移动建设成本。因此,收到的消息数量不会影响strand::post()的性能。

+0

嘿坦纳,我很感激你的详细解释。实际上,我正在测量从线程A发布事件到线程的性能,直到线程开始处理它为止。对不起,我昨天赶紧下班:) –