由于CPU类型,C ++ Boost Multithread比单线程慢?

时间:2011-05-21 04:47:58

标签: c++ multithreading boost

之前我发布了一些提升多线程。这次我只是好奇和失望,因为我认为多线程假设比单线程更快。

两个线程是FILE I / O读取/解析CSV数据。当我使用多线程时,DELL DESKTOP OPTILEX 745的每台机器PENTIUM D CPU平均需要大约40秒。

使用单线程,平均需要大约8-10秒的同一台PC。

我曾尝试从这两个线程中使用完全不同的参数名称,结果没有什么不同。如果有人使用过c ++ boost多线程来读取大数据文件并进行解析,我很想听听你的意见。谢谢。 安德鲁

2 个答案:

答案 0 :(得分:4)

  

两个线程是FILE I / O读取/解析CSV数据。

如果他们使用相同的文件句柄读取相同的文件,那么他们可能会花费大部分时间来阻止等待另一个线程完成。如果他们使用不同的文件句柄来读取同一个文件,他们就会强制磁盘继续来回搜索,这不像直接顺序读取那样有效。

线程不会加速大文件读取和解析。它的作用是让你在读取和解析文件时完全做其他事情。

您已经创建了一个I / O瓶颈,但线程无效。线程用于在算法被分解为独立的执行线程时减少CPU瓶颈;

通常不能很好地解决先前输出(文件解析是一种情况)的算法

如果您可以拆分解析问题并让每个线程解析文件的不同部分,您可能会得到一些改进,但可能不会因为搜索会浪费您的时间。如果你可以让一个线程进行批量读取和一些预处理,那么将块交给一个线程池进行真正繁重的处理(是否可以?),那么你可能会看到单个线程有一些显着的改进。

这是一般性的,有点意识流,但是用你所给予的东西做很多事情很难。我希望它有所帮助。

答案 1 :(得分:1)

如果没有看到您的代码,很难确切地说明发生了什么,但一般来说,多线程并不一定能让您获得更好的性能,实际上通常会导致明显的性能下降。

在您的情况下,如果您正在读取和解析两个线程,那么它们可能会争用I / O,并且可能围绕任何共享读/写内存区域的锁定,这两者都会引入减速单线程版本没有问题。

为了正确地执行此操作,您可能希望从文件中读取单个线程,并在生成器/使用者队列中进行解析数据的另一个线程。这样可以最大限度地减少锁争用(因为它只能通过服务员实现),并且可以确保您实际利用问题中可用的parralellization。

话虽如此,单线程版本可能仍然更快;情况经常如此。