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

Posted

技术标签:

【中文标题】由于 CPU 类型,C++ Boost 多线程比单线程慢?【英文标题】:C++ Boost Multithread is slower than single thread because of CPU type? 【发布时间】:2011-05-21 04:47:57 【问题描述】:

我之前发布过一些 boost 多线程。这次我只是好奇和失望,因为我认为多线程应该比单线程快。

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

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

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

【问题讨论】:

【参考方案1】:

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

如果他们正在使用相同的文件句柄读取相同的文件,那么他们可能会花费大部分时间等待其他线程完成。如果他们使用不同的文件句柄来读取同一个文件,他们就会迫使磁盘不断地来回寻找,这不像直接顺序读取那样有效。

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

您创建了一个 I/O 瓶颈,线程无法解决这个问题。当算法可以分解为独立的执行线程时,线程旨在减少 CPU 瓶颈;对先前输出有很大依赖性的算法(文件解析是一种情况)通常不能很好地处理。

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

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

【讨论】:

你们俩都给了我很棒的 cmets 和建议。为了公平起见,我不会接受你们任何一个人的回答。我会尝试根据你们的建议考虑如何改进我的多线程。仅供参考,两个线程在同一目录中读取不同的文件。谢谢,迈克。【参考方案2】:

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

在您的情况下,如果您同时让线程读取和解析,那么它们可能会争用 I/O,并且可能会争用任何共享读/写内存区域周围的锁,这两者都会导致速度变慢单线程版本没有问题。

要正确执行此操作,您可能需要一个线程从文件中读取数据,而另一个线程在数据进入生产者/消费者队列时对其进行解析。这将最大限度地减少锁争用(因为它只能由服务员实现),并确保您真正利用了问题中可用的并行化。

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

【讨论】:

感谢您的 cmets。对于可能会减慢处理数据的共享读/写内存,您可能是正确的。一位先生提到,如果两个文件存储在同一个磁盘上,可能会导致硬盘出现碎片和性能问题。 是的,如果您不是从文件中连续读取,那将为您提供驱动器的随机读取性能(尤其是对于小块),而不是驱动器能够提供的连续读取性能... 前者通常慢得多

以上是关于由于 CPU 类型,C++ Boost 多线程比单线程慢?的主要内容,如果未能解决你的问题,请参考以下文章

为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快。

pythonprocess多核更慢

什么?Python的多进程居然比单进程慢?

什么?Python的多进程居然比单进程慢?

C++11 多线程比单线程慢

面试官:单核 CPU 支持 Java 多线程吗?什么?