gpt4 book ai didi

java - 我怎样才能使这个计算更快?

转载 作者:行者123 更新时间:2023-12-01 20:00:11 25 4
gpt4 key购买 nike

我的函数是total += Math.sqrt(num) - Math.cbrt(num);我想将其应用于每个数字,直到我确定的最大值(从0开始)。所以我在下面编写了一些代码,它使用除法技术来计算得更快。我怎样才能加快这个计算?下面的代码(8 个线程)需要20 秒才能完成,而非线程需要150 秒才能完成。我相信使用forkjoinpool我可以让它更快,或者并行流?如何与他们一起实现?

public class Main {

private static int targetNum = Integer.MAX_VALUE;
private static int threadCount = 8;
private static double total = 0;
public static void main(String[] args) {
// write your code here
DecimalFormat df2 = new DecimalFormat(".##");
long time = System.currentTimeMillis();


ExecutorService executor = Executors.newFixedThreadPool(threadCount);

try {
ArrayList<Future<Double>> futureList = new ArrayList<>();
for(int a = 0; a < threadCount; a++){
calculatorService ss = new calculatorService(a*(targetNum/threadCount) ,(a+1) *(targetNum/threadCount));
futureList.add(executor.submit(ss));
}
for(int a = 0; a < threadCount; a++){
total+= futureList.get(a).get();
}

System.out.println("Result= "+ df2.format(total) + "\nTime passed= " + ((System.currentTimeMillis() - time)/1000f));
executor.shutdown();
} catch (Exception e) {
e.printStackTrace();
}

}
}
class calculatorService implements Callable<Double>{

private int start,end;

public SqrtSummer(int start, int end) {
this.start = start;
this.end = end;
}

@Override
public Double call(){
double total = 0;
for (int a = start; a < end; a++) {
total += Math.sqrt(a) - Math.cbrt(a);
}
return total;
}
}

编辑 1

futureList.get(a).get();我必须这样做,因为我不知道线程(核心)计数。因此我不能写 futureList.get(0).get() + futureList.get(1).get()..... 我知道 futureList.get(0).get() 循环会等待,但它们仍然将做好他们的工作。我的线程数不固定,随时可能发生变化。

最佳答案

当您的应用程序是 I/O 密集型时,多线程可以受益。然而,这个应用程序对计算敏感,也许分配 threadCount 您的处理器数量是最好的选择:

private static int threadCount = Runtime.getRuntime().availableProcessors();

关于java - 我怎样才能使这个计算更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250694/

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