如何减少从一个增强链到另一个增强链的延迟

时间:2011-12-16 03:23:25

标签: c++ boost boost-asio

假设在向量m_poStrands中存储了几个boost strand share_ptr。而tJobType是枚举表示不同类型的工作。 我发现在一个链(JOBA)中发布作业以调用另一个链(JOBB)的onJob的时间差异大约为50毫秒。 我想知道是否有办法减少时间差异。

void postJob(tJobType oType, UINT8* pcBuffer, size_t iSize)
{
//...
    m_poStrands[oType]->post(boost::bind(&onJob, this, oType, pcDestBuffer, iSize));
}

void onJob(tJobType oType, UINT8* pcBuffer, size_t iSize)
{
       if (oType == JOBA)
       {
       //....
         struct timeval sTV;
    gettimeofday(&sTV, 0);
    memcpy(pcDestBuffer, &sTV, sizeof(sTV));
    pcDestBuffer += sizeof(sTV);
    iSize += sizeof(sTV);

    memcpy(pcDestBuffer, pcBuffer, iSize);

         m_poStrands[JOBB]->(boost::bind(&onJob, this, JOBB, pcDestBuffer, iSize));
       }
       else if (oType == JOBB)
       {
        // get the time from buffer
        // and calculate the dime diff
        struct timeval eTV;
        gettimeofday(&eTV, 0);
       }
}

1 个答案:

答案 0 :(得分:2)

您的延迟可能来自memcpy之间的gettimeofday。这是我在我的机器上运行的示例程序(2 ghz core 2 duo)。我得到了数千纳秒。所以几微秒。我怀疑你的系统运行速度比我的慢4个数量级。我见过的最糟糕的是两次测试中的一次是100微秒。我试图使代码尽可能接近发布的代码。

#include <boost/asio.hpp>
#include <boost/chrono.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <iostream>

struct Test {
    boost::shared_ptr<boost::asio::strand>* strands;
    boost::chrono::high_resolution_clock::time_point start;
    int id;

    Test(int i, boost::shared_ptr<boost::asio::strand>* strnds)
        : id(i),
          strands(strnds)
    {
        strands[0]->post(boost::bind(&Test::callback,this,0));
    }

    void callback(int i) {
        if (i == 0) {
          start = boost::chrono::high_resolution_clock::now();
          strands[1]->post(boost::bind(&Test::callback,this,1));
        } else {
          boost::chrono::nanoseconds sec = boost::chrono::high_resolution_clock::now() - start;
          std::cout << "test " << id << " took " << sec.count() << " ns" << std::endl;
        }
    }
};

int main() {
    boost::asio::io_service io_service_;
    boost::shared_ptr<boost::asio::strand> strands[2];
    strands[0] = boost::shared_ptr<boost::asio::strand>(new boost::asio::strand(io_service_));
    strands[1] = boost::shared_ptr<boost::asio::strand>(new boost::asio::strand(io_service_));
    boost::thread t1 (boost::bind(&boost::asio::io_service::run, &io_service_));
    boost::thread t2 (boost::bind(&boost::asio::io_service::run, &io_service_));
    Test test1 (1, strands);
    Test test2 (2, strands);
    t1.join();
    t2.join();
}