我想用多个线程加密文件,以减少所花费的时间。我在intel i5处理器,4 GB内存,visual c ++ 2008上运行。问题是当我在调试模式下运行代码(visual c ++ 2008)时,所用的时间更长,例如,如果我使用一个线程加密3 mb文件,花费的时间是5秒,但是当我使用两个线程时,花费的时间是10秒。在调试模式下使用2个线程时,时间应该很短。但在发布模式下,没有问题,使用多个线程所花费的时间很短。 是否可以在更短的时间内以调试模式运行代码?在visual c ++ 2008中有改变的设置吗?
void load()
{
ifstream readF ("3mb.txt");
string output; string out;
if(readF.is_open())
{
while(!readF.eof())
{
getline(readF,out);
output=output+'\n'+out;
}
readF.close();
//cout<<output<<endl;
//cout<<output.size()<<endl;
text[0]=output;
}
else
cout<<"couldnt open file!"<<endl;
}
unsigned Counter;
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
cout<<"encrypting..."<<endl;
Enc(text[0]);
_endthreadex( 0 );
return 0;
}
unsigned __stdcall SecondThreadFunc2( void* pArguments )
{
cout<<"encrypting..."<<endl;
//Enc(text[0]);
_endthreadex( 0 );
return 0;
}
int main()
{
load();
HANDLE hThread[10];
unsigned threadID;
time_t start, end;
start =time(0);
hThread[0] = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID);
hThread[1] = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc2, NULL, 0, &threadID );
WaitForSingleObject( hThread[0], INFINITE );
WaitForSingleObject( hThread[1], INFINITE );
CloseHandle( hThread[0] );
end=time(0);
cout<<"Time taken : "<<difftime(end, start) << "second(s)" << endl;
system("pause");
}
答案 0 :(得分:0)
可能更慢的一个潜在原因是多个线程需要将数据从内存加载到cpu缓存中。在调试模式下,数据结构周围可能存在额外的填充,旨在捕获缓冲区溢出。这可能意味着当cpu从一个线程切换到另一个线程时,它需要刷新缓存并从ram重新加载所有数据。但是,在没有填充的发布模式下,两个线程的足够数据都适合缓存,因此运行速度更快。
如果添加更多线程,即使在发布模式下,您也会发现添加更多线程会导致收益递减,然后开始变慢,而不是更少的线程。