我正在设计一个提供有关Collatz序列组的统计信息的类。我的目标之一是能够以最大的效率同时处理大量包含巨大术语的序列(数百个甚至数千个数字)。
为此,我计划为每个单独的统计数据使用最佳的数据收集技术,这意味着ForkJoinPool
可以更有效地处理某些任务,而Executors
中提供的标准缓存和固定线程池可以更有效地处理某些任务。如果我走了那条路线,创建多个线程池或关闭一个线程池并创建另一个线程池的开销会比我节省的更多吗?
最佳答案
如果我走了那条路线,创建多个线程池或关闭一个线程池并创建另一个线程池的开销会比我节省的更多吗?
我们怎么可能告诉你呢?
关闭和重新启动线程池肯定有开销。如果有的话。创建线程并不便宜。
但是,我们无法量化使用不同种类的线程池节省的费用。如果我们无法量化,就您的策略是否行得通……是不可能的。
(但是我认为反复关闭并重新创建线程池是一个坏主意。空闲池对性能的影响很小。)
这“嗅到”过早的优化。 (这就像在制造发动机缸体之前尝试调整赛车的发动机一样!)
我的建议是(主要是1)忘记性能。目前,专注于获得有用的东西。这是我会做的:
使用最简单的策略实施代码,编写测试用例,进行测试/调试,直到工作为止。
选择一个样本问题或一组您将尝试解决的典型问题
实施一个测试工具,使您可以评估示例问题的代码性能。 (当心Java基准测试的标准问题...)
对代码进行基准测试。
够快吗?立即停止。
如果没有,请继续。
实施替代策略之一,然后进行测试/调试。
对修改后的代码进行基准测试。
够快吗?立即停止。
很明显这没有帮助吗?放弃它,然后尝试另一种策略。
你可以调整吗?如果是这样,请尝试。
转到5。
另外,可能有必要实施不同的策略,以便您可以使用命令行或配置文件设置对其进行调整或在它们之间进行切换。
通常,很难先验确定任何复杂算法或策略的执行效果。一般来说,对于提供可靠预测的理论方法或直观方法,有太多因素需要考虑。基准测试和调整是必经之路。
1-显然,如果您知道某种技术或算法的性能会很差,并且您有更好的替代方法,那就是可以通过相同的努力来实现...做明智的事情。
关于java - 对不同类型的任务使用不同的线程池值得吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46107845/