gpt4 book ai didi

java - ExecutorService Future::非常慢

转载 作者:行者123 更新时间:2023-12-03 12:59:43 25 4
gpt4 key购买 nike

我正在并行化一个相当复杂的程序,以使其更快。为此,我大部分时间都使用ExecutorService。到现在为止,它的运行情况还不错,但是后来我注意到,只有一行代码使我的程序以最快的速度运行。这是exactScore.get()的行。

我不知道为什么,但是有时要获得Future Object的两倍值,它有时需要超过0.1 s。

为什么是这样?我如何处理它运行速度更快?有没有一种方法可以在多线程时直接在Double[]中编写?
谢谢

int processors = Runtime.getRuntime().availableProcessors();
ExecutorService service = Executors.newFixedThreadPool(processors);

// initialize output
Double[] presortedExScores = new Double[sortedHeuScores.length];

for(int i =0; i < sortedHeuScores.length; i++ ){
final int index = i;
final Collection<MolecularFormula> formulas_for_exact_method = multimap.get(sortedHeuScores[i]);
for (final MolecularFormula formula : formulas_for_exact_method){
Future<Double> exactScore = service.submit(new Callable<Double>() {
@Override
public Double call() throws Exception {
return getScore(computeTreeExactly(computeGraph(formula)));
}
});
presortedExScores[index] = exactScore.get();
}

}

最佳答案

这是可以预料的。那就不慢了;它只是在做自己的工作。

从javadoc中获取get():

必要时等待计算完成,然后检索其结果。

长话短说:似乎您不了解您在代码中使用的概念。 future 的想法是,它会在将来的某个时刻进行操作。

通过调用get(),您可以表示:我不介意现在等到Future可用的“计算”之后。

因此:您必须退后一步,再次查看您的代码;了解您不同的“ Activity 线程”是如何工作的;以及他们何时/如何回到一起。

我想到一个想法:现在,您正在循环创建Future对象;在创建Future之后,直接在其上调用get()。这与创建多个 future 的想法完全矛盾。换句话说:而不是去:

foreach X
create future X.i
wait/get future X.i

你可以做类似的事情
foreach X
create future X.i

foreach X
wait/get for future X.i

换句话说:允许您的 future 真正并行地做事;而不是强制执行 顺序处理。

如果那不能帮助“足够”,那么就说:您必须查看整体设计,并确定是否存在进一步“分解”事物的方法。现在,所有 Activity 都“紧密”在一起发生;令人惊讶的是:当您同时进行大量工作时,这需要时间。但您可能会猜到:这样的重新设计可能需要大量工作;而且在不了解您的问题/代码库的情况下几乎是不可能的。

一种更复杂的方法是编写代码,其中每个Future都有一些表达“我完成了”的方式-然后,您将“仅”启动所有Future。然后等到最后一个回来。但是如前所述;我无法在这里为您设计完整的解决方案。

另一个真正重要的收获是:不要盲目地使用一些“偶然的”代码来工作。编程的本质是理解 以及源代码中使用的任何概念。在运行它并发现“哦,那个 get()会使事情变慢”之前,您应该对自己的代码在 中执行的操作有一个很好的了解。

关于java - ExecutorService Future::非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41684447/

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