我刚刚学习了Java中并行处理的基础知识。 我读到了这个问题:Multiple threads and performance on a single CPU并且想知道在单核系统上多线程可能比单线程更快的原因还有其他原因。 我在考虑每个线程如何拥有它自己使用的内存。 想象一下,在Java中,FXML是主线程的一部分。这可能会增加主线程内存的大小,反过来这可能会减慢线程速度,因为它必须在交换上加载更多的值,或者更糟糕的是,必须对内存进行更多调用(我认为当前线程的值被复制到缓存中。
总结一下,在单核系统上制作多个线程会因内存分离而提高性能吗?
答案 0 :(得分:16)
在大多数情况下,在单个CPU上拥有多个线程可以提高性能,因为在大多数情况下,线程并不忙于进行计算,而是等待事情发生。
这包括I / O,例如等待磁盘操作完成,等待数据包从网络到达,等待用户输入等等甚至一些非I / O情况,例如等待一个不同的线程来表示事件已经发生。
因此,由于线程花费大部分时间只做等待,所以它们相互竞争CPU的频率远远低于您的想象。
这就是为什么如果你看一下现代台式计算机中活动线程的数量,你可能会看到数百个线程,如果你看一下服务器,你可能会看到数千个线程。这显然远远超过了计算机所拥有的核心数量,显然,如果没有它的好处就不会这样做。
单个核心上的多个线程无法提高性能的唯一情况是线程忙于进行不间断计算。这往往只发生在特殊情况下,如科学计算,加密货币挖掘等。
因此,单核系统上的多个线程通常会提高性能,但这与内存几乎没有关系,并且就其而言,它与“分离”内存无关。
事实上,运行多个线程(在同一个核心上,甚至是同一芯片上的不同核心)主要访问不同的内存区域(而且他们大多数都这样做)往往会伤害性能因为每次CPU从一个线程切换到另一个线程时,它就开始访问一组不同的内存位置,这些位置不太可能位于CPU的缓存中,因此每个上下文切换后都会出现一连串的缓存未命中,代表开销。但通常,它仍然值得。