как уменьшить задержку от одной цепи повышения к другой цепи повышения - PullRequest
2 голосов
/ 16 декабря 2011

Предположим, что в векторе m_poStrands хранится несколько надстроек share_ptr. А tJobType - это перечисление различных типов заданий. Я обнаружил, что разница во времени от публикации работы в одной цепочке (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);
       }
}

1 Ответ

2 голосов
/ 30 января 2012

Ваша задержка, вероятно, исходит из memcpy s между вашими gettimeofday s.Вот пример программы, которую я запустил на своей машине (2 ГГц 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();
}
...