gpt4 book ai didi

java - 哪个更快?在更多 runnables 中做更少的工作,还是在更少的 runnables 中做更多的工作? (执行服务)

转载 作者:行者123 更新时间:2023-12-04 20:41:53 30 4
gpt4 key购买 nike

我正在尝试找出如何从多线程应用程序中获得最大性能。
我有一个这样创建的线程池:

ExecutorService executor = Executors.newFixedThreadPool(8); // I have 8 CPU cores.  

我的问题是,我应该将工作划分为仅 8 个可运行对象/可调用对象(与线程池中的线程数相同),还是应该将其划分为 1000000 个可运行对象/可调用对象?

for (int i = 0; i < 1000000; i++) 
{
Callable<Long> worker = new MyCallable(); // Each worker does little work.
Future<Long> submit = executor.submit(worker);
}

long sum = 0;

for (Future<Long> future : list)
sum += future.get(); // Much more overhead from the for loops

for (int i = 0; i < 8; i++) 
{
Callable<Long> worker = new MyCallable(); // Each worker does much more work.
Future<Long> submit = executor.submit(worker);
}

long sum = 0;

for (Future<Long> future : list)
sum += future.get(); // Negligible overhead from the for loops

分成 1000000 个可调用项对我来说似乎比较慢,因为实例化所有这些可调用项并在 for 循环中从中收集结果会产生开销。另一方面,如果我有 8 个可调用对象,那么这个开销可以忽略不计。而且由于我只有 8 个线程,我无法同时运行 1000000 个可调用对象,因此没有性能提升。

我是对还是错?

顺便说一句,我可以测试这些情况,但操作非常简单,我猜编译器意识到这一点并进行了一些优化。所以结果可能会产生误导。我想知道哪种方法更适合图像处理应用。

最佳答案

这个问题没有直接的答案,因为它取决于很多事情,例如您的代码、应用程序 loigc、最大值、可能的并发性、硬件等。

但是在考虑并发性时,您应该考虑以下事项,

  1. 每个 runnable 都需要一个线程专用的堆栈,因此如果您创建较大的 no。线程中的线程内存消耗超过实际应用程序使用量

  2. 线程应该执行独立且并行的任务。

    找出可以在没有任何依赖的情况下实际并行执行的代码补丁,否则线程将无济于事

  3. 什么是硬件配置?

    您可以达到的线程的最大并发执行数等于总数。 CPU核心。如果你有更少的没有。核心和巨大的没有。线程然后切换任务比实际线程更活跃(使用 cpu)。这会严重影响性能

总而言之,你的第二种方法对我来说看起来不错,但如果可能的话,你可以找到更多的并行性,你可以将它扩展到 20-30。

关于java - 哪个更快?在更多 runnables 中做更少的工作,还是在更少的 runnables 中做更多的工作? (执行服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27036521/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com