我尝试在代码中使用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
编译。