long endTime = System.currentTimeMillis();
时间: 2023-11-15 17:54:52 浏览: 116
好的,你的第一个问题是long endTime = System.currentTimeMillis();的作用是什么?
这行代码的作用是获取当前系统时间的毫秒数,并将其赋值给变量endTime。通常情况下,我们会在代码的某个位置记录开始时间和结束时间,然后计算它们之间的时间差,以便评估代码的性能或者统计某个操作所需的时间。
相关问题
public static void main(String[] args) { long startTime = System.currentTimeMillis(); int a = 10; int result = 1; while (a>1){ result *=a*(a-1); a-=2; } long endTime = System.currentTimeMillis(); System.out.println(result); System.out.printf("优化后的循环费时: %d ns%n", endTime - startTime); }优化
这段代码的问题在于它没有正确地计算阶乘,应该是 `result *= a;` 而不是 `result *= a*(a-1);`。另外,对于优化循环费时,可以考虑使用更高效的算法,如递归或者使用数学公式计算阶乘。以下是一个使用递归计算阶乘的示例代码:
```
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
int n = 10;
int result = factorial(n);
long endTime = System.currentTimeMillis();
System.out.println(result);
System.out.printf("优化后的循环费时: %d ns%n", endTime - startTime);
}
private static int factorial(int n) {
if (n == 1) {
return 1;
}
return n * factorial(n-1);
}
```
这个代码使用递归计算阶乘,比起原来的循环计算更加简洁和高效。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ParallelDemo { public static void main(String[] args) { int[] data = new int[1000000]; for (int i = 0; i < data.length; i++) { data[i] = i; } long startTime = System.currentTimeMillis(); // 通过线程池并行计算 ExecutorService executorService = Executors.newFixedThreadPool(4); final int[] sum = {0}; for (int i = 0; i < 4; i++) { final int start = i * (data.length / 4); final int end = (i + 1) * (data.length / 4); executorService.execute(new Runnable() { public void run() { int localSum = 0; for (int j = start; j < end; j++) { localSum += data[j]; } synchronized (ParallelDemo.class) { sum[0] += localSum; } } }); } executorService.shutdown(); while (!executorService.isTerminated()) {} long endTime = System.currentTimeMillis(); System.out.println("并行计算结果:" + sum[0]); System.out.println("并行计算耗时:" + (endTime - startTime) + "ms"); startTime = System.currentTimeMillis(); // 通过单线程串行计算 sum[0] = 0; for (int i = 0; i < data.length; i++) { sum[0] += data[i]; } endTime = System.currentTimeMillis(); System.out.println("串行计算结果:" + sum[0]); System.out.println("串行计算耗时:" + (endTime - startTime) + "ms"); } } 对这个代码进行注释
这是一个 Java 代码示例,演示了如何通过线程池并行计算数组的总和,以及通过单线程串行计算数组的总和,并比较两种方式的耗时。以下是对代码的注释:
```
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ParallelDemo {
public static void main(String[] args) {
int[] data = new int[1000000]; // 创建一个包含 1000000 个元素的数组
for (int i = 0; i < data.length; i++) {
data[i] = i; // 对数组进行初始化,每个元素的值为它的下标
}
long startTime = System.currentTimeMillis();
// 通过线程池并行计算
ExecutorService executorService = Executors.newFixedThreadPool(4); // 创建一个固定大小为 4 的线程池
final int[] sum = {0}; // 创建一个只包含一个元素的数组,用于保存计算结果
for (int i = 0; i < 4; i++) { // 将数组分成 4 个部分,每个部分由一个线程计算
final int start = i * (data.length / 4); // 计算当前部分的起始下标
final int end = (i + 1) * (data.length / 4); // 计算当前部分的结束下标
executorService.execute(new Runnable() {
public void run() {
int localSum = 0; // 创建一个局部变量,用于保存当前线程计算的总和
for (int j = start; j < end; j++) {
localSum += data[j]; // 计算当前部分的总和
}
synchronized (ParallelDemo.class) { // 使用类对象作为锁,确保共享变量的正确性
sum[0] += localSum; // 将当前部分的总和加到共享变量中
}
}
});
}
executorService.shutdown(); // 关闭线程池
while (!executorService.isTerminated()) {} // 等待所有线程执行完毕
long endTime = System.currentTimeMillis();
System.out.println("并行计算结果:" + sum[0]); // 输出并行计算的结果
System.out.println("并行计算耗时:" + (endTime - startTime) + "ms"); // 输出并行计算的耗时
startTime = System.currentTimeMillis();
// 通过单线程串行计算
sum[0] = 0; // 将共享变量清零
for (int i = 0; i < data.length; i++) {
sum[0] += data[i]; // 计算数组的总和
}
endTime = System.currentTimeMillis();
System.out.println("串行计算结果:" + sum[0]); // 输出串行计算的结果
System.out.println("串行计算耗时:" + (endTime - startTime) + "ms"); // 输出串行计算的耗时
}
}
```
阅读全文