2012-02-04 83 views
0

我想用多个线程加密文件,以减少花费的时间。即时运行在英特尔i5处理器,4 GB的内存,visual c + + 2008年。问题是,当我在调试模式下运行下面的代码(Visual C++ 2008),所用的时间更长,例如,如果我使用一个线程加密3 MB文件,花费的时间是5秒,但是当我使用两个线程时,花费的时间是10秒。在调试模式下使用2个线程时,时间应该很短。但在发布模式下,没有任何问题,使用多线程的时间很短。 是否可以在更短的时间内以调试模式运行代码? visual C++ 2008中有没有设置改变?如何使用C++窗口线程

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

当您将数据加载到数据块时,某些加密算法将加密单个数据块以生成另一个块。但要小心,因为某些算法会加密第二个数据块以产生不同的数据,这取决于第一个数据块中的数据。这种类型的加密算法实际上并不是多线程的,因为它依赖于串行通过数据。 – 2012-02-04 15:53:30

回答

0

它可能比较慢的一个潜在的原因是,多个线程需要从存储器加载数据到CPU的高速缓存。在调试模式下,可能会有额外的数据结构填充等,以便捕获缓冲区溢出。这可能意味着当CPU从一个线程切换到另一个线程时,它需要刷新缓存并重新加载RAM中的所有数据。但是,在没有填充的发布模式下,两个线程的足够数据都适合缓存,所以它会更快运行。

即使在发布模式下,如果添加更多线程,您将会发现添加更多线程会带来递减收益,然后实际上会比减少线程慢。

+0

我很高兴你提出了这个问题,因为我会想,除非将一个文件的块分配给线程进行加密,然后重新组合并写出,这比让一个线程/进程在文件上撕裂要慢很多。 – octopusgrabbus 2012-02-04 15:48:05