как использовать оконную нить c ++ - PullRequest
0 голосов
/ 04 февраля 2012

Я хотел бы зашифровать файл с несколькими потоками, чтобы сократить время, необходимое.Я работаю на процессоре Intel i5, 4 ГБ памяти, Visual C ++ 2008. Проблема в том, что когда я запускаю код ниже в режиме отладки (Visual C ++ 2008), больше времени, например, если я использую один поток для шифрования 3 МБ файла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");
}

1 Ответ

0 голосов
/ 04 февраля 2012

Потенциальная причина, по которой это может быть медленнее, заключается в том, что нескольким потокам потребуется загрузить данные из памяти в кэш процессора.В режиме отладки может быть дополнительное заполнение структур данных и т. Д., Которое предназначено для обнаружения переполнения буфера.Это может означать, что когда процессор переключается с одного потока на другой, ему необходимо очистить кэш и перезагрузить все данные из оперативной памяти.Но в режиме выпуска, где нет заполнения, в кэш помещается достаточно данных для обоих потоков, поэтому он будет работать быстрее.

Вы найдете даже в режиме выпуска, если добавите больше потоков, вы достигнететочка, в которой добавление большего количества потоков приводит к уменьшению отдачи, а затем фактически начинает выполняться медленнее, чем меньшее количество потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...