2011-12-16 29 views
2

假设存在多个增强链share_ptr存储在向量m_poStrands中。而tJobType是enum表示不同类型的作业。 我发现在一条链(JOBA)中发布工作以调用另一条链的onJob(JOBB)的时间差约为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); 
     } 
} 

回答

2

您的等待时间大概是从memcpy来临了您的gettimeofday秒之间。这里是我在我的机器上运行的一个示例程序(2 GHz核心2双核)。我得到了几千纳秒。所以几微秒。我怀疑你的系统运行速度比我的慢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(); 
}