C++ Boost regex_replace可以并行执行吗?
我曾尝试在代码中使用boost线程和regex,但对C++ Boost regex_replace可以并行执行吗?,c++,regex,multithreading,boost,C++,Regex,Multithreading,Boost,我曾尝试在代码中使用boost线程和regex,但对regex\u replace的行为感到困惑 在测试类中,我尝试执行regex_replace2000000次次,以THREAD_NUMthreads分隔: class ThreadClass { public: ThreadClass() { _urlExp.assign(L"/*a regex expression here*/", wregex::icase); } void runThread()
regex\u replace
的行为感到困惑
在测试类中,我尝试执行regex_replace2000000次
次,以THREAD_NUM
threads分隔:
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;
};
正如我所评论的,当只运行一个线程时,代码花费28.58秒;但是,如果我取消对第二个线程的注释,代码将花费36.28秒
当使用2线程时,CPU实际上是200%。我知道由于多线程成本的原因,2线程时间应该大于14.29s,但是怎么可能大于28.58s呢
regex_replace实际上是不是不并行,线程之间是否在等待?或者我的代码或编译有问题
联阿援助团-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,boost 1.49.0,gcc 4.1.2,使用
-O2
编译,在哪里定义了THREAD\u NUM
呢?噢,sry:THREAD\u NUM
在第二个线程被注释掉时设置为1,在未注释时设置为2。我在这里写这个注释,因为我的答案不能解决这个问题(由于它是在粘贴代码中发布的,除了(tend.tv_usec-tstart.tv_usec)/1000000
将始终产生零,因为tv_usec
保证小于1000000,并且这里执行整数除法,请更改为1000000.0以执行浮点除法),我将删除它。但是,我无法重现您的问题。通过更改代码,使其能够在Windows下编译(主要是运行时间计算代码-使用的函数),并使其更具可重新运行性-使其能够计算多个线程计数的基准,并使用单个设置(线程计数)多次运行结果如下:线程数=1;运行时间=30.65s
,线程数=2;运行时间=19.31s
,线程数=3;运行时间=15.86s
,线程数=4;运行时间=13.86s
。此外,我还需要更改boost::Thread
>,到std::thread
,因为我的机器上没有boost。可能是boost::thread
有问题。
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