C++ 如何使用c++;窗纱
我想用多个线程加密文件,以减少所需时间。IM运行在英特尔I5处理器,4 GB内存,Visual C++ 2008。问题是,当我在调试模式下运行代码(Visual C++ 2008)时,所花费的时间更长,例如,如果我使用一个线程加密3 MB文件,时间为5秒,但是当我使用两个线程时,所花费的时间是10秒。在调试模式下使用2个线程时,时间应该很短。但在发布模式下,没有问题,使用多个线程所花费的时间很短。 是否可以在调试模式下以更短的时间运行代码?Visual C++ 2008中是否有更改设置?C++ 如何使用c++;窗纱,c++,visual-c++,C++,Visual C++,我想用多个线程加密文件,以减少所需时间。IM运行在英特尔I5处理器,4 GB内存,Visual C++ 2008。问题是,当我在调试模式下运行代码(Visual C++ 2008)时,所花费的时间更长,例如,如果我使用一个线程加密3 MB文件,时间为5秒,但是当我使用两个线程时,所花费的时间是10秒。在调试模式下使用2个线程时,时间应该很短。但在发布模式下,没有问题,使用多个线程所花费的时间很短。 是否可以在调试模式下以更短的时间运行代码?Visual C++ 2008中是否有更改设置? voi
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");
}
void load()
{
ifstream readF(“3mb.txt”);
字符串输出;
if(readF.is_open())
{
而(!readF.eof())
{
getline(readF,out);
输出=输出+'\n'+out;
}
readF.close();
//cout可能较慢的一个潜在原因是,多个线程需要将数据从内存加载到cpu缓存中。在调试模式下,数据结构等周围可能有额外的填充,用于捕获缓冲区溢出。这可能意味着当cpu从一个线程切换到另一个线程时,它需要刷新缓存并重新加载所有数据都来自ram。但是,在没有填充的发布模式下,两个线程都有足够的数据放入缓存,所以它会运行得更快
您会发现,即使在发布模式下,如果您添加更多线程,您也会达到这样的程度:添加更多线程会带来递减的回报,然后实际上开始比减少线程慢。我很高兴您提出了这一点,因为我会想,除非将文件片段分配给线程进行加密,然后重新组装和写入这比让一个线程/进程撕开文件要慢得多。当你把一堆数据切碎成数据块时,一些加密算法会加密一个单独的数据块以生成另一个数据块。但是,要小心,因为有些算法会加密第二个数据块以生成不同的数据依赖项这种类型的加密算法实际上不能是多线程的,因为它依赖于串行地遍历数据。