【问题标题】:Multi threaded program takes longer to execute than the Single Threaded Program多线程程序的执行时间比单线程程序要长
【发布时间】:2013-01-05 15:13:50
【问题描述】:

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

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

}

【问题讨论】:

  • 您对您的程序进行了概要分析吗?还是你用了秒表?您还在哪台机器上测试您的单线程/多线程应用程序?
  • @Zeta 我分别运行了这两个程序大约 5 次。我对 C++ 和多线程程序比较陌生。我使用 cpu 时间戳差异来获取执行时间。我在 Windows 7 中使用了 Intel core i3 2.1GHz、2Gb RAM 的笔记本电脑来测试程序。
  • 添加一些代码来检查结果。您会发现多线程版本不会产生正确的答案。在你做对之前不要试图让它变快。
  • 你使用 rdtsc() 的时间显示了什么?
  • “SortedStringVector = *StringVector;”复制向量并复制向量中的所有字符串。这是非常昂贵的。

标签: c++ multithreading


【解决方案1】:

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

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

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

【讨论】:

  • 我在我的台式电脑上执行了相同的程序,其中包括英特尔双核 2.7GHz 和 2GB RAM。这次我使用clock() 的差异来测量时间。令我惊讶的是,单线程程序产生了 60035,而多线程程序产生了 48279、48414。这清楚地表明了改进。这是因为笔记本处理器是 i3 处理器而台式机是双核的执行差异吗???
  • 首先,clock 仍然是错误的函数,因为它还计算处理器滴答声。其次,要看到并行处理的好处,您需要测量整体时间,而不是单个线程使用的时间。第三,您通常无法比较不同计算机之间的此类测量值。
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2015-03-12
  • 2021-06-16
相关资源
最近更新 更多