假设需要构建一个需要超快的类似电子表格的引擎,每个单元依赖关系都可以在并行计算分支上。可以为每个并行分支创建线程吗?就内存而言,线程不是很昂贵。您很容易认为,如果有 1000 个公式行甚至 100 万行,您将不得不创建相同数量的线程,这是否现实?
如果这是不现实的,这种情况下是否有替代线程的方法?
假设需要构建一个需要超快的类似电子表格的引擎,每个单元依赖关系都可以在并行计算分支上。可以为每个并行分支创建线程吗?就内存而言,线程不是很昂贵。您很容易认为,如果有 1000 个公式行甚至 100 万行,您将不得不创建相同数量的线程,这是否现实?
如果这是不现实的,这种情况下是否有替代线程的方法?
对于 CPU 密集型任务,最佳线程数通常是相同数量的 CPU。如果您不小心,创建线程的开销可能比线程所做的工作要高得多。
CPU 通常不是主要问题,这毫无价值。通常,内存带宽或缓存利用率更多是一个问题,在这种情况下,有效地写入一个线程可以胜过尝试将工作分配到多个线程。如果每个线程所做的工作都是 CPU 密集型的,并且使用相对较少的内存带宽,那么拥有多个线程会有所帮助。
在现代 Java 编程中,您应该完全避免使用线程,而是使用执行程序。世界其他地方称它们为工作队列。请参阅Joshua Bloch在Effective Java中的第 68 条。
就个人而言,我非常喜欢 Grand Central Dispatch 的 API。Java 版本称为HawtDispatch。该 API 更简单,并且可以正常工作。
你最好的选择是Java 中的Task Parallel Library或 Fork/Join Framework。他们确实使用线程,但优化了线程数并将工作项放在工作队列中。他们以非常聪明的方式处理了许多低级优化问题。您只需使用 Parallel.For 等结构即可。
任务并行库可以帮助您尽可能多地利用 CPU,并为您完成大部分繁重的线程创建工作。
如果您有大量(非常)可并行化的计算,并且您需要绝对最佳的性能,那么您将不得不超越 cpu。还有一些将 LINQ/TPL 与 GPU 相结合的替代方案,例如 MS。加速器和梵天。参见例如Utilizing the GPU with c#
另请查看Ateji PX。它是用于并行化的 java 语言的扩展,可能会对您有所帮助。它是一种商业产品,但同时它已免费提供。