Java代码性能瓶颈:循环优化案例
在Java编程中,循环是常见的操作,也是可能成为性能瓶颈的地方。这里我们来看一个具体的循环优化案例。
假设我们有一个数组int[] arr = new int[1000];
,我们需要遍历这个数组并计算每个元素的平方和(Sum of Squares)。
原始代码可能如下:
long sumOfSquares = 0;
for (int i : arr) {
sumOfSquares += i * i;
}
这看起来是线性的,时间复杂度为O(n),其中n是数组的长度。然而,对于大数组,计算平方和本身就有较高的时间消耗。
优化策略:
并行计算:如果硬件支持多核,可以将数组分成多个部分并行计算。例如使用
java.util.concurrent
包中的ExecutorService
和Callable
。使用内置方法:Java 8引入了
IntStream
和DoubleStream
,可以直接进行平方和的计算。
示例代码(使用并行计算):
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// 假设你的数据是可分割的
List<Callable<Long>> tasks = new ArrayList<>();
for (int i : arr) {
tasks.add(() -> i * i));
}
ExecutorService executor = Executors.newFixedThreadPool(4); // 使用4个线程
long sumOfSquaresParallel = 0;
try {
List<Long> results = executor.invokeAll(tasks);
for (Long result : results) {
sumOfSquaresParallel += result; // 合并结果
}
} finally {
executor.shutdown();
while (!executor.isTerminated())) {} // 等待所有任务完成
}
这段代码首先将任务添加到tasks
列表,然后创建一个固定大小的线程池来执行这些任务。最后,它会等待所有任务完成后关闭线程池。
还没有评论,来说两句吧...