是否为不同类型的任务使用不同的线程池值得开销?

时间:2017-09-08 02:43:48

标签: java multithreading threadpool

我正在设计一个类,提供有关Collat​​z序列组的统计信息。我的目标之一是能够以最高效率同时处理包含大量术语(数百甚至数千位数字)的大量序列。

为此,我计划为每个统计数据使用最佳数据收集技术,这意味着ForkJoinPool可以更有效地处理某些任务,其他任务可以通过标准缓存和固定线程池来处理。 Executors。如果我走这条路线,创建多个线程池或关闭一个线程池并创建另一个线程池的开销是否会比我节省的成本更高?

2 个答案:

答案 0 :(得分:1)

  

创建多个线程池,或关闭一个线程池并创建另一个线程池,如果我走这条路线,是否会花费我的成本比我保存的更多?

我们怎么可能告诉你那个?

关闭并重新启动线程池肯定存在开销。如果有的话。创建线程并不便宜。

但是,我们无法通过使用不同类型的线程池来量化您节省了多少。如果我们无法量化,就不可能就您的策略是否有效提出建议。

(但我认为反复关闭和​​重新创建线程池是一个坏主意。 idle 池的性能影响很小。)

这"气味"过早优化。 (这就像在制造发动机缸体之前试图调整赛车的发动机一样!)

我的建议是(主要是 1 )忘记性能开始。现在,专注于获得有效的东西。这就是我要做的事情:

  1. 使用最简单的策略实现代码,编写测试用例,测试/调试直到它工作。
  2. 选择您将尝试解决的典型问题或一组问题
  3. 实施一个测试工具,可以测量代码问题的代码性能。 (注意Java基准测试的标准问题......)
  4. 对代码进行基准测试。
    • 足够快吗?现在停止。
    • 如果没有,请继续。
  5. 实施其中一种替代策略,并进行测试/调试。
  6. 对修改后的代码进行基准测试。
    • 足够快吗?现在停止。
    • 很明显它没有帮助吗?放弃它,并尝试另一种策略。
    • 你能调整一下吗?如果是这样,试试吧。
  7. 转到5.
  8. 此外,以这种方式实现不同的策略可能是值得的,您可以使用命令行或配置文件设置来调整它们或在它们之间切换。

    作为一般规则,很难确定先验任何复杂的算法或策略的执行情况。一般来说,有太多因素需要考虑理论......或直观......方法来提供可靠的预测。基准测试和调整是可行的方法。

    1 - 显然,如果你知道某些技术或算法会表现不佳,并且你有一个更好的替代方案,那就是实现同样的努力...做明智的事情

答案 1 :(得分:1)

由于您只讨论两种不同类型的池(基于fork-join和Executor的池),并且您声称至少某些任务更适合于一种类型或池或另一种,使用两种类型的池的开销很可能是值得的。

毕竟,您可以保持两种类型的池都处于活动状态,因此设置池和创建线程只需要一次成本,而两者的(明显)好处池类型将适用于整个处理过程。因为你正在做一个巨大的"工作量甚至小的好处最终会加起来并压倒一次性成本(这可能是在每个线程的微架构中测量的)。

这一观察的关键在于,您没有使用的池中现有但非活动的线程没有真正的持续开销。

当然,这就是说,简单的回答它只是尝试两种方法并测量它!"。

相关问题