多线程程序比单线程程序执行时间更长

时间:2013-01-05 15:13:50

标签: c++ multithreading

我用C ++编写了一个字符串排序程序,我的问题基本上是从一个txt文件读取一些字符串块并放入一个向量并对字符串进行排序。首先,我使用单线程程序测量了排序执行时间。然后我将矢量分成两个protion并使用两个线程对它们进行排序。但问题是多线程程序比单线程程序花费更多时间执行。有人可以解释一下我的原因是什么吗?谢谢。

顺便说一下,字符串向量包含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);

}

1 个答案:

答案 0 :(得分:3)

首先,您正在使用处理器时钟滴答来衡量性能,并且通过该度量任何多线程算法将更慢而不是等效的单个 - 线程算法。原因是因为这个度量有效地计算了执行的指令数量,并且线程总是给算法增加一点开销。

要获得正确的性能测量,您需要测量挂钟时间。这样,测量可以准确地反映不同核心/处理器并行完成的工作。

此外,在调整并行执行算法时,您需要确保算法保持一致(在您的问题中,单线程和多线程排序不相同。多线程版本需要额外的传递将两个部分排在一起)并且线程之间没有太多的通信开销(这里不是真正的问题,但考虑一种算法,其中线程X需要来自线程Y的结果才能计算出自己的结果)。