瓶颈是磁盘.
您每次只能使用一个线程访问磁盘,因此使用多个线程无济于事,而线程切换所需的加班时间将减慢您的全局性能.
只有当你需要拆分你的工作等待在不同的源(例如网络和磁盘,或两个不同的磁盘,或许多网络流)上进行长I/O操作,或者如果你有一个cpu密集型操作可以使用多线程时,使用多线程是很有趣的.在不同的核心之间分裂.
请记住,对于一个好的多线程程序,您需要始终考虑:
切换线程之间的上下文时间
长I/O操作可以并行完成
计算的密集cpu时间是否存在
cpu计算可以在子问题中拆分或不拆分
在线程之间共享数据的复杂性(信号量或同步)
与单线程应用程序相比,难以读取,编写和管理多线程代码
可能有不同的因素:
最重要的是避免同时从多个线程访问磁盘(但是因为你在SSD上,你可能会侥幸逃脱).但是,在普通的硬盘上,从一个文件切换到另一个文件可能需要10毫秒的搜索时间(取决于数据的缓存方式).
1000个线程太多,尝试使用核心数*2.太多时间只会丢失切换上下文.
尝试使用线程池.总时间在110毫秒到130毫秒之间,其中一部分来自创建线程.
一般来说,在测试中做一些更多的工作.定时110ms并不总是那么准确.还取决于当时正在运行的其他进程或线程.
尝试切换测试的顺序,看看它是否有所作为(缓存可能是一个重要因素)
countLinesThread(num); countLinesOneProcess(num);
此外,根据系统,currentTimeMillis()
可能具有10至15毫秒的分辨率.因此,短时间运行并不是非常准确.
long start = System.currentTimeMillis(); long end = System.currentTimeMillis();