16 java io multithreading
在Goetz的"实践中的Java并发"中,在第101页的脚注中,他写道:"对于这样的计算问题,没有I/O并且不访问共享数据,Ncpu或Ncpu + 1线程产生最佳吞吐量;更多线程不帮助,实际上可能会降低性能......"
我的问题是,在执行文件写入,文件读取,文件删除等I/O操作时,是否有用于实现最高性能的线程数的指导原则?我知道这只是一个指导编号,因为磁盘速度和许多其他因素都会影响到这一点.
不过,我想知道:在4-cpu机器上,20个线程可以将1000个单独的文件写入磁盘,而不是4个线程吗?
Ste*_*dit 11
在实践中,I/O绑定的应用程序仍然可以从多线程中获益,因为并行读取或写入一些并行的文件要快得多.特别是在整体吞吐量受网络延迟影响的情况下.但同样的情况是,一个线程可以处理它读取的最后一个东西,而另一个线程正忙于读取,从而允许更高的CPU利用率.
我们可以整天谈论理论,但正确的答案是使线程的数量可配置.我想你会发现,将它增加到1可以提高你的速度,但也会有一个收益递减的点.
是的,在 4 CPU 的机器上,20 个线程绝对可以比 4 个线程更快地写入磁盘。许多真实的程序受 I/O 限制多于 CPU 限制。但是,这在很大程度上取决于您的磁盘以及其他线程在最终等待这些磁盘之前正在执行的 CPU 工作量。
如果您的所有线程都只写入磁盘而不执行其他操作,那么 4 CPU 机器上的 1 个线程实际上是写入磁盘的最快方式。这完全取决于您拥有多少磁盘、您正在写入多少数据以及您的操作系统在 I/O 调度方面的表现如何。您的具体问题表明您希望 4 个线程都写入同一个文件。这没有多大意义,在任何实际情况下,我都想不出这会更快。(你必须提前分配文件,然后每个线程会 seek() 到不同的位置,当每个线程试图写一些块时,你最终只会颠簸写头。)
当您受网络限制时,多线程的优势要简单得多。即:等待数据库服务器或网络浏览器等。您正在等待多个外部资源。
就像所有与性能相关的事情一样,这取决于情况。
如果您受 I/O 限制,那么添加线程根本不会帮助您。(好吧,正如Steven Sudit指出的那样,您可能会提高性能,但幅度很小)如果您不受 I/O 限制,那么添加线程可能会有所帮助
并不是想变得聪明,但找出答案的最佳方法是对其进行分析,看看什么适合您的特定情况。
编辑:根据评论更新