QT多线程读取大数量文件,多线程效率没有单线程高

在QT中使用QThread类创建多线程读取多个文件,多线程反而比单线程要慢?
在主程序中将多个文件路径平均分配给创建的线程,在线程中使用循环挨个打开并读取文件内容。
本来单线程读取300个文件要10秒左右,开了双线程之后消耗时间不仅没减少反而成倍增加了,要花20秒左右,是什么原因呢

可能由于以下原因导致多线程比单线程更慢:

线程创建和销毁的开销:在创建和销毁线程时,会涉及到一定的时间和资源开销。如果线程的工作量比较小,那么线程的创建和销毁可能会成为瓶颈,从而导致多线程反而比单线程更慢。

文件I/O操作的瓶颈:如果多个线程同时对磁盘进行读取操作,可能会导致磁盘I/O成为瓶颈,从而导致读取速度变慢。这种情况下,使用多线程可能会使得磁盘I/O更加频繁,反而使得读取速度变慢。

针对这些问题,您可以考虑以下优化策略:

线程池模式:不要为每个文件创建一个线程,而是使用线程池来管理线程。在线程池中,可以提前创建好多个线程,并保持处于等待状态,一旦有任务要执行,就从线程池中取出一个线程执行任务,执行完成后再放回线程池。这样就可以减少线程创建和销毁的开销,提高了多线程执行的效率。

文件I/O优化:可以在进行文件读取操作时,降低磁盘I/O的频率。例如,可以将多个文件分配给每个线程进行读取,而不是一个线程读取所有文件。同时,还可以使用缓存等技术来减少磁盘I/O的次数,提高读取效率。

充分利用CPU资源:多线程执行时,可以充分利用CPU资源,提高CPU的利用率。可以使用线程池、任务队列等技术来充分利用CPU资源,提高多线程执行效率。

最后,需要根据具体情况选择合适的优化策略,综合考虑线程数量、任务负载、硬件资源等因素进行调整,以达到最优的多线程执行效果。


多线程在执行多个串口通信、多个TCP端口通信、或者多个纯内存计算上,是可以提高效率的
但是在文件存储过程中,文件是按字节顺序保存在硬盘中的,单线程访问时,磁头不需要频繁改变即可顺序读取
而改为多线程后,磁头反而需要不停切换柱面
除非你是固态硬盘,否则不要这么搞