【问题标题】:Why don't a see a performance increase while using a threadpool?为什么我在使用线程池时没有看到性能提升?
【发布时间】:2013-05-24 09:37:53
【问题描述】:

我编写了一个 2D Raycaster,可以将光线绘制到任何 java 形状,包括:

Line2D、Rectangle2D、Ellipse2D、QuadCurve2D 和 CubicCurve2D。

它背后的数学实际上非常复杂和密集,特别是对于四边形和三次方,所以我设置了一个线程池。 我根据可用内核的数量创建了一个具有固定线程数的 ExecutionService “exec”。

然后,我将负责每个形状的代码块更改为静态可运行文件。 从 raycaster 方法中,我将执行 runnables 然后调用 exec.shutdown()。 最后,id 创建一个在 exec.isTerminated 返回 true 之前不会退出的 while 循环。

这可确保所有线程在继续之前都已执行完毕。

现在,从我在网上看到的情况来看,这是一种流行的方法,但我没有看到改进的结果。 如果不是更糟,它总是一样的。 有没有合适的方法来使用线程池,实际上提高效率而不是匹配开销?

【问题讨论】:

  • 也许你的 while 循环占用了大量的 cpu
  • 请发布您的代码!
  • 也许您的机器中有 1 个 CPU 内核,而您的程序已经使用了 100% 的 CPU 功率?

标签: java multithreading threadpool raytracing raycasting


【解决方案1】:

正如@Adam Siemion 所说,首先确保您的 PC 不受 CPU 限制,并且您确实拥有多核 CPU。否则无论如何你都不能更快。

其次,不要动态创建线程。使用带有任务队列的线程池(参见 java.util.concurrent 中的 ExecutorService 等)。如果您不断为大量小任务创建线程,那么线程创建和清理会占用相当多的时间。

第三,我建议确保你的线程同时结束,使用 CyclicBarrier 或 CountDownLatch 之类的东西,而不是自己在线程中等待。

如果以上方法不能解决您的问题,请在此处发布一些代码。另一个猜测是你有一些共享资源串行依赖,例如画线等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多