2012-02-04 3 views
0

소요 시간을 줄이기 위해 여러 스레드로 파일을 암호화하고 싶습니다. 인텔 i5 프로세서, 4 GB 메모리, Visual C++ 2008에서 실행되는 문제입니다. 디버그 모드 (Visual C++ 2008) 아래에서 코드를 실행할 때 문제가 발생합니다. 예를 들어, 한 스레드를 사용하여 3MB 파일을 암호화하면 시간이 오래 걸립니다. 찍은 시간은 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

데이터 블록에 데이터가 잘린 경우 일부 암호화 알고리즘은 개별 블록의 데이터를 암호화하여 다른 블록을 생성합니다. 그러나 일부 알고리즘은 첫 번째 블록에있는 데이터에 따라 다른 데이터를 생성하기 위해 두 번째 데이터 블록을 암호화하므로주의해야합니다. 이러한 유형의 암호화 알고리즘은 데이터를 순차적으로 처리하는 데 의존하기 때문에 실제로는 다중 스레드 될 수 없습니다. –

답변

0

잠재적 인 이유는 여러 스레드가 CPU의 캐시로 메모리에서 데이터를로드 할 필요가 있다는 것입니다. 디버그 모드에서 버퍼 오버 플로우를 잡으려는 데이터 구조 등에 여분의 패딩이있을 수 있습니다. 즉, CPU가 한 스레드에서 다른 스레드로 전환 할 때 캐시를 플러시하고 RAM에서 모든 데이터를 다시로드해야합니다. 그러나 패딩이없는 릴리스 모드에서는 두 스레드에 대한 충분한 데이터가 캐시에 저장되므로 데이터가 더 빠르게 실행됩니다. 당신이 더 많은 스레드를 추가 할 위치를 점에 도달 할 더 많은 스레드를 추가하는 경우도 릴리스 모드에서 찾을 수

은 수확 체감을 제공하고 실제로 더 적은 스레드보다 느리게 이동하기 시작합니다.

+0

파일 조각을 암호화 용 스레드에 할당 한 다음 재조 립하고 쓰지 않으면 한 스레드/프로세스가 파일을 찢어 버리게하는 것보다 훨씬 느릴 것이라고 생각했기 때문에이 파일을 가져와서 다행입니다. – octopusgrabbus