我的问题是,在执行文件写入、文件读取、文件删除等I/O操作时,是否有指导方针来确定使用的线程数以实现最大性能? 我明白这只是一个指导数字,因为磁盘速度和众多其他因素都会影响性能。
尽管如此,我还是想知道:在4个CPU的机器上,20个线程能否比4个线程更快地将1000个单独的文件写入磁盘?
实际上,即使是I/O绑定的应用程序也可以从多线程中受益,因为并行读写几个文件比按顺序读写要快得多。特别是在网络延迟影响总吞吐量的情况下更是如此。但是,在一个线程正在处理最后读取的内容的同时,另一个线程可以忙于读取,从而允许更高的CPU利用率。
我们可以一整天都谈论理论,但正确的答案是使线程数可配置。我认为,将其增加到1以上将提高速度,但也会出现收益递减的情况。
另请参见使用RandomAccessFile时,使用多个线程是否有助于提高性能?
更新: 我在那里添加了一个基准测试。
像所有与性能有关的事情一样,这取决于情况。
如果您受到I/O限制,则添加线程将完全无助于您。(好吧,正如Steven Sudit所指出的那样,您可能会获得一些性能提升,但它会很小) 如果您没有受到I/O限制,则添加线程可能有所帮助。
不是要聪明,但找出最好的方法是对其进行分析,并查看哪种方法适用于您特定的情况。
编辑:根据评论更新
Ncpu + 预期的并发IO活动数量是我的常规数字。
关键不在于20个线程可以比4个线程更快地将单个文件写入磁盘。如果每个CPU只有1个线程,那么当您正在写入磁盘时,您的进程将无法使用托管执行文件IO的线程的CPU。该CPU实际上正在等待文件被写入,而如果您有一个以上的线程,则它可以使用CPU在此期间进行实际处理。
如果你使用线程的唯一目的是写入磁盘,那么你的性能提升将会微不足道,甚至有害,因为通常驱动程序都针对硬盘的顺序读取进行了优化,所以你正在将文件中的顺序写入转换为多个“随机”写入。
如果 I/O 是针对不同的磁盘、不同的网络卡或不同的数据库服务器进行的,则多线程只能帮助你解决 I/O 绑定问题,从性能角度来看。然而,在观察到的性能方面,差异可能会更大。
例如,假设你要通过网络向许多不同的接收器发送多个文件。你仍然受到网络限制,因此你的最大速度不会超过100Mb/S,但如果你使用20个线程,那么这个过程将会变得更加公平。