我的Java应用程序基本上是这样做的:
这些应用程序中的一个应该为每个核心实现理论上100%的速度提升,但是,处理信息的线程越多,它就会获得SLOWER!
示例:
答案 0 :(得分:1)
在添加线程时获得这种性能意味着您正在做一些非常错误的事情。通常添加线程不会提供任何速度改进,有时可能会对你造成一些惩罚,但添加另一个线程并使程序运行时间加倍是非常不寻常的。
以下是需要调查的一些事项:
ExecutorService
而不是自己管理自己的主题。这通常会删除大量用户代码和相关的错误。见Executors.newFixedThreadPool(numThread)
。new Thread(...).start()
而不是直接致电run()
。join()
?您应该start()
所有线程,将线路分配给它们,然后在末尾join()
。如果您在问题中向我们展示了一些线程代码,我们可以提供更多帮助。
答案 1 :(得分:0)
未经充分优化的代码通常会耗尽整个内存带宽。在多核处理器上使用相同的未优化代码添加另一个线程,它们将在它们之间分配带宽,此外,相当频繁地相互碰撞,进一步降低了速度。
格雷说:“......程序运行时间加倍是非常不寻常的。”我不同意。这通常是在开始优化内存访问之前在C代码中发生的情况。我说从一开始就看不到减速是非常不寻常的。我不知道Java是否有可用的采样,但这是一个显而易见的起点。