对于一个典型的受计算限制对于应用程序,一个好的经验法则是使用与硬件核心(或超线程)一样多的线程。使用比内核更多的线程不会使您的应用程序运行得更快。相反,它会导致您的应用程序使用超出所需的内存。每个线程通常有一个 0.5 到 1Mbyte 的堆栈……具体取决于您的硬件和 Java 版本。如果创建太多线程,额外的内存使用将导致性能显着下降;即更多的线程=>更慢的程序!
另一件需要考虑的事情是,在典型的 JVM 上创建 Java 线程的成本很高。因此,除非线程(在其生命周期内)完成了足够的工作,否则您创建线程所花费的时间可能会多于在计算中使用多个核心所获得的时间。
最后,您可能会发现工作并没有均匀地分布在所有线程上,具体取决于您的最小最大算法……以及游戏状态。
如果我尝试实现这一点,我首先将其实现为单线程应用程序,然后:
- 对它进行基准测试以找出串行运行时计算更多需要多长时间,
- 分析它以消除任何瓶颈
- 重新进行基准测试,看看它是否足够快。
当且仅当需要更快时,我才会检查代码并(如果需要)添加一些监视,以了解如何将计算分解为足够大的块以并行执行。
最后,我将使用这些结果来设计和实现多线程版本。
我还会考虑替代方案...例如使用 Java 7 fork/join 而不是线程。
回答您的直接问题:
使用25个线程效率高吗?
可能不会。只有拥有那么多核心才有效(不太可能!)。即使如此,如果通过并行运行事物获得的收益多于因线程相关开销而损失的收益,那么您只能通过使用大量线程获得良好的加速。 (换句话说,这取决于您使用这些线程的效率。)
使用 25 个线程意味着什么?
我假设you意味着您已经创建并启动了 25 个线程,无论是显式的还是使用某些现有的线程池实现。
但最重要的是,如果你有(比如说)4 个核心,那么at most这 25 个线程中的 4 个可以同时执行。其他线程将等待...
是不是快了 25 倍(很可能不是)?这取决于什么?当然是在计算机上,但是我怎么知道根据计算机的资源可以使用多少个线程呢?
限制性能的主要因素是核心数量。往上看。
如果我使用太多线程会发生什么(我猜没有......)?
太多线程意味着您使用更多内存,并且由于内存带宽竞争、物理内存页竞争、额外的垃圾收集,这会使您的应用程序运行速度变慢。这些因素取决于应用程序和平台,并且难以量化;即预测或测量。
根据应用程序的性质(即具体如何实现算法),过多的线程可能会导致额外的锁争用和线程上下文切换。这也会使你的应用程序变慢。
如果不看到实际代码,就不可能预测会发生什么。但核心数量为您提供了可能的加速程度的理论上限。如果您有 4 个核心,那么通过多线程就无法获得超过 4 倍的加速。