我有一个很容易并行化的简单任务。基本上,相同的操作必须在一个(大的,几个 Gb)输入文件的每一行上重复执行。虽然我已经制作了一个多线程版本,但我注意到我的 I/O 是瓶颈。我决定构建一个实用程序类,其中包含一个“文件读取器”线程,该线程简单地直接向前读取并尽可能快地读取到循环缓冲区中。然后,多个消费者可以调用这个类并获得他们的“下一行”。给定 n 个线程,每个线程 i 的起始行是文件中的第 i 行,并且通过添加 n 找到该线程的每个后续行。事实证明,这不需要锁,几个关键的原子操作足以保留不变量。
我已经测试了代码,它似乎更快,但再想一想,我不知道为什么。将大文件分成 n 个输入文件不是一样快吗(您可以提前“搜索”到同一个文件中以实现相同的目的,最少的预处理),然后让每个进程简单地调用 iostream::readLine on它自己的块?(因为 iostream 也会读入它自己的缓冲区)。在多个线程之间共享单个缓冲区似乎没有任何固有的优势,因为工作人员实际上并不是在同一行数据上操作。另外,我认为没有什么好的方法可以并行化,这样它们就可以在同一条线上工作。我只想了解我所看到的性能提升,并知道它是“flukey”还是跨平台可扩展/可重现......