前几天遇到一个很有意思的问题,提炼出来就是使用多线程去读取文件的话会加快读取速度吗?
在往下看之前先自己想一想,同样如果在面试中问你这个问题该怎么回答呢?
假设有一个文件大小为10G,我们需要将其读取到内存中(假设内存能容纳下该文件),那么使用多个线程分块去读取的话会加快读取速度吗,比如我们创建两个线程,一个线程读取前5G数据;另一个线程读取后5G数据,这会比只是用一个线程将其读入内存快吗?
先说答案,使用多个线程去读取文件通常是一个bad idea。
为什么?
烧菜是需要时间的
为什么使用多个线程去读取文件通常是一个bad idea呢?
原因就在于虽然我们可以使用多个线程来充分利用多个CPU核心,但是不要忘了,磁盘只有一个。
因此简单的使用多个线程并不能加快文件的读取速度。这就好比一个餐馆,这个餐馆中有多个服务员,但是只有一个厨师;服务员下单很简单,即一句话的事儿,但是厨师做一道菜出来是需要很多时间的,一个服务员下的单就够厨师忙的了,多个服务员同时下单并不能提高厨师的产出。
在这里服务员就好比CPU,厨师就好比磁盘。
实际上使用多个线程来读取文件可能会使得情况更加糟糕,这就涉及到了对磁盘结构的理解。
理解磁盘
当然,这里的磁盘是指的机械磁盘,这类磁盘需要把磁头放到正确的磁道上,接着等待相应的扇区转到该磁头下才可以读取磁盘数据。
因此磁盘中最耗时的其实并不是把数据从磁盘读取到磁头,最耗时的其实是把磁头移动到正确的磁道上&