可以升级regex_replace并行执行吗?

时间:2016-02-23 13:26:37

标签: c++ regex multithreading boost

我尝试在代码中使用boost thread和regex,但对regex_replace的行为感到困惑。

在测试类中,我尝试执行regex_replace 2000000次,由THREAD_NUM个线程分隔:

class ThreadClass {
public:
    ThreadClass() {
        _urlExp.assign(L"/*a regex expression here*/", wregex::icase);
    }
    void runThread() {
        for (int i=0; i<2000000/THREAD_NUM; i++) {
        wstring wtext(L"/*a long url here*/");
        regex_replace(wtext, _urlExp, L"[URL]");
    }
}
private:
    wregex _urlExp;
};

之后,main计算平均时间费用:

int main(int argc, char** argv) {
    ThreadClass tc1;
    //ThreadClass tc2;
    timeval tstart, tend;
    gettimeofday(&tstart, NULL);
    boost::thread thrd1(boost::bind(&ThreadClass::runThread, &tc1));
    //boost::thread thrd2(boost::bind(&ThreadClass::runThread, &tc2));
    thrd1.join();
    //thrd2.join();
    gettimeofday(&tend, NULL);
    double cost = tend.tv_sec - tstart.tv_sec + (tend.tv_usec - tstart.tv_usec) / 1000000; // calculate in second
    cout << cost << endl;
    return 0;
}

正如我评论的那样,当只运行一个线程时代码成本为28.58;但是,如果我取消注释第二个线程,代码成本为36.28s。

当使用2线程时,CPU实际上是200%。我知道由于多线程费用,2线程时间应该> 14.29s,但它怎么可能> 28.58s?

regex_replace实际上并不是平行的并且线程正在相互等待?或者我的代码或编译有问题?

uname -a:

Linux e100069200229.zmf 2.6.32-220.23.2.ali927.el5.x86_64 #1 SMP Mon Jan 28 14:57:06 CST 2013 x86_64 x86_64 x86_64 GNU/Linux

16核CPU,升级1.49.0,gcc 4.1.2,使用-O2编译。

0 个答案:

没有答案