2011-05-21 70 views
2

我曾经发布过一些boost多线程。这一次我只是好奇和失望,因为我认为多线程应该比单一线程更快。C++ Boost由于CPU类型,多线程比单线程慢?

两个线程文件I/O读取/解析CSV数据。当我使用多线程时,每台机器PENTIUM D CPU从DELL DESKTOP OPTILEX 745平均花费约40秒。

单线程,平均花费大约8-10秒。

我曾试图从这些两个线程使用完全不同的参数的名字,结果是没有什么不同。如果有人曾经使用C++ boost多线程读取大数据文件和解析之前,我很想听听你的意见。谢谢。 Andrew

回答

1

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

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

要做到这一点正确,你可能会想一个线程从文件中读取,而另一个线程解析数据,因为它来在一个生产者/消费者队列。这可以最大限度地减少锁争用(因为它只能用服务员实现),并且可以确保您可以充分利用问题中可用的参数。

这就是说,单线程版本可能仍然会更快;往往是这样。

+0

感谢您的意见。您可能对共享读/写内存的正确性可能会减慢以处理数据。一位先生提到,如果两个文件存储在同一个磁盘上,可能会导致硬盘问题,碎片和性能。 – AndrewS 2011-05-21 05:09:17

+0

是的,如果你没有连续阅读文件,那会给你驱动器的随机读取性能(特别是对于小块),而不是驱动器能够连续读取的性能......前者通常*很*慢。 – Jason 2011-05-21 05:58:09

4

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

如果他们正在读取具有相同文件句柄的相同文件,那么他们可能会花费大部分时间阻止等待另一个线程完成。如果他们使用不同的文件句柄来读取同一个文件,他们会迫使磁盘继续前后查找,这不如直接顺序读取那样有效。

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

您已经创建了一个I/O瓶颈,这线程不会帮助。当算法可以分解为独立的执行线程时,线程用于减少CPU瓶颈;对以前输出有很大依赖性的算法(文件解析是一种情况)通常不太好。

如果你能拆分解析问题,让每个线程解析该文件的不同部分,你可能会得到一点点改善,但可能不会因为追求会浪费你的时间。如果你可以有一个线程进行批量读取和一些预处理,然后将块移交给线程池以进行真正的繁重处理(还有其他什么?),那么你可能会看到比单线程有明显改进。

这是所有普通和位流的意识,但很难做到跟你要提供的更多。我希望它有帮助。

+0

你们俩都给了我很棒的评论和建议。我不会接受你们任何一个的公平答案。我会尽量考虑如何根据你们的建议来改进我的多线程。仅供参考,两个线程读取不同文件相同的目录。谢谢,迈克。 – AndrewS 2011-05-21 05:21:39