for (int i = 0; i < data.length; i++) {
data[i] = Math.sqrt(Math.pow(uData[i], 2) + Math.pow(vData[i], 2));
}
是需要计算风速
一次length 大概有6500个,但是要计算 1500个层次。 相当于要计算 1500 * 6500
目前是用for循环,大概全部完成需要250~300秒。
也试过手动创建多线程跑,计算时间并没有改善,不知道为什么。
private double[] parallelHandelWindData(double[] dataU, double[] dataV) throws InterruptedException {
Integer length = dataU.length;
double[] data = new double[length];
//创建一个线程池
ExecutorService executorService = new ThreadPoolExecutor(
10,
10,
20,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(5),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy());
List<Runnable> tasks = new ArrayList<>();
for (Integer i = 0; i < 8; i++) {
int startIndex = length / 8 * i;
int endIndex = length / 8 * (i + 1);
double[] uDataBlock = ArrayUtil.sub(dataU, startIndex, endIndex);
double[] vDataBlock = ArrayUtil.sub(dataV, startIndex, endIndex);
tasks.addAll(Arrays.asList(() -> sqrtAndPowWindData(data, uDataBlock, vDataBlock, startIndex, endIndex)));
}
//逐个提交任务
tasks.forEach(executorService::submit);
executorService.shutdown();
// 线程池最大有效执行时间
executorService.awaitTermination(10, TimeUnit.MINUTES);
return data;
}
private double[] sqrtAndPowWindData(double[] data, double[] uDataBlock, double[] vDataBlock, int startIndex, int endIndex) {
for (int i = startIndex; i < endIndex; i++) {
data[i] = Math.sqrt(Math.pow(uDataBlock[i-startIndex], 2) + Math.pow(vDataBlock[i-startIndex], 2));
}
return data;
}
先确定问题在哪,再提问,你的代码中的 Math 这点计算量,完全不够当代计算机看的。
这是我模拟的代码,运行 1500 次,每次生成两组 6500 长度的 double 数组,两个数组执行你的方法,平均 350 毫秒执行完成,我的机器是 mac m1 pro,即使是再差的机器,也不会比这个数值高到哪里去。
因此,只可能消耗大量时间的地方是你获取数据的部分。