2

私はC++で文字列ソートプログラムを書きました.私の質問は、基本的にtxtファイルからいくつかの文字列チャンクを読み取り、ベクトルに入れて文字列をソートすることです. 最初に、シングル スレッド プログラムを使用して並べ替えの実行時間を測定しました。次に、ベクトルを 2 つの部分に分割し、2 つのスレッドを使用して並べ替えます。しかし問題は、マルチスレッド プログラムはシングル スレッド プログラムよりも実行に時間がかかることです。誰かが理由を説明できますか?..ありがとう。

ちなみに、文字列ベクトルには 20 文字の長さ 100 万の文字列レコードが含まれており、ファイルの読み取り機能は追加していません。

シングルスレッドプログラム..

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
#include <intrin.h>

#pragma intrinsic(__rdtsc)
using namespace std;

vector<string> ReadFile();


int main()
{

vector<string> RandomStringVector;
unsigned __int64 t1,t2;

RandomStringVector = ReadFile();

t1 = __rdtsc();
sort(RandomStringVector.begin(),RandomStringVector.end());
t2 = __rdtsc();
printf_s("%I64d ticks\n", (t2 - t1)/1000000);

system("pause");
return 0;
}

これがマルチスレッドプログラムです

#include <process.h>
#include <windows.h>
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
#include <intrin.h>

#pragma intrinsic(__rdtsc)
using namespace std;

void SortString(void * arg);
vector<string> ReadFile();

int main(){ 

vector<string> FullStringVector;
FullStringVector = ReadFile();

vector<string> v1(FullStringVector.begin(), FullStringVector.begin() + FullStringVector.size()/2),
    v2(FullStringVector.begin() + FullStringVector.size()/2 +1, FullStringVector.end());


_beginthread( SortString, 0, (void *)&v1);
_beginthread( SortString, 0, (void *)&v2);

system("pause");
return 0;
}

void SortString(void *arg)
{
unsigned __int64 t1,t2;
vector<string> * StringVector;
vector<string> SortedStringVector;
StringVector = (vector<string> *)arg;
SortedStringVector = *StringVector;
t1 = __rdtsc();
sort(SortedStringVector.begin(),SortedStringVector.end());
t2 = __rdtsc();
printf_s("%I64d ticks\n", (t2 - t1)/1000000);

}
4

1 に答える 1

3

まず第一に、プロセッサ クロック ティックを使用してパフォーマンスを測定しているためマルチスレッド アルゴリズムは同等のシングルスレッド アルゴリズムよりも遅くなります。その理由は、この測定では実行される命令の数が効果的にカウントされ、スレッド化によって常にアルゴリズムに多少のオーバーヘッドが追加されるためです。

パフォーマンスを適切に測定するには、壁時計の時間を測定する必要があります。このようにして、測定値は、異なるコア/プロセッサによって並行して行われる作業を正確に反映できます。

また、アルゴリズムを並列実行に適応させるときは、アルゴリズムが一貫していることを確認する必要があります (質問では、シングルスレッドとマルチスレッドの並べ替えは同一ではありません。マルチスレッド バージョンでは、並べ替えに追加のパスが必要です。スレッド間の通信オーバーヘッドがあまり大きくないこと (ここでは実際には問題ではありませんが、スレッド X が独自の結果を計算する前にスレッド Y からの結果を必要とするアルゴリズムを考えてみてください)。

于 2013-01-05T16:37:28.283 に答える