Java 编译优化和性能
Java compilation optimization and performance
public static void main(String[] args) {
double [] boxes;
boxes = new double[] {20, 10, 5, 40, 20, 41, 41, 2, 6, 7, 3, 4, 5, 6, 23, 34, 7, 8, 2, 2};
double heaviest = 0;
double normal = 0;
double heavy = 0;
double totalCost;
double a = 0;
double b = 0;
int repeatCount=0;
for (int i = 1; i < boxes.length; i++) {
if (boxes[i] > heaviest)
heaviest = boxes[i];
}
for(double element: boxes) {
if(element==heaviest) {
repeatCount = repeatCount+1;
}
}
System.out.println("Count :" +repeatCount);
for (int j =0; j<boxes.length; j++) {
if (boxes[j] < heaviest) {
a = boxes[j] * 2;
normal = normal+a;
} else {
b = (boxes[j] * 3.5);
heavy = heavy+b;
}
}
totalCost = normal+heavy;
System.out.println("total cost of the insuranse is "+ totalCost);
}
第 1 部分: 我需要将最大的元素乘以 3.5
并与 2
相加,然后将值相加得到总和。
第 2 部分: 另外我想要最大元素出现的次数。 OR我们也可以将最大的元素存储在另一个数组中。
在我的代码中,我完成了第 1 部分,对于第 2 部分,我计算了最大元素的出现次数。
我的问题:
如果有超过 1000
个元素,是否有任何其他方法可以减少编译时间或使代码更优化?
我也尝试通过将数组转换为列表来使用 Collections.frequency(myArray, largestElement)
。
一如既往,正确性比性能更重要。
不确定为什么在寻找最重的时候会忽略第一个框。
您可以减少代码,但最大的问题是您的代码 运行 不够长,无法被 JIT 编译。即便如此,与 Java.
的启动成本相比也是微不足道的
总之,除非你的程序持续几百毫秒,否则我不会担心性能。
顺便说一句,您可以使用单个循环来缩短代码,但就像我说的那样,在这种情况下不会有太大区别。
我可能会这样写。
double[] boxes = {20, 10, 5, 40, 20, 41, 41, 2, 6, 7, 3, 4, 5, 6, 23, 34, 7, 8, 2, 2};
double heaviest = -1;
int count = 0;
double sum = 0;
for (double box : boxes) {
sum += box;
if (box > heaviest) {
count = 1;
heaviest = box;
} else if (box == heaviest) {
count++;
}
}
// double total = sum * 2 - heaviest * count * 2 + heaviest * count * 3.5;
double total = sum * 2 + heaviest * count * 1.5;
System.out.println("total: " + total);
注意:只有一个循环。你可以边走边算出计数和总和。
public static void main(String[] args) {
double [] boxes = new double[] {20, 10, 5, 40, 20, 41, 41, 2, 6, 7, 3, 4, 5, 6, 23, 34, 7, 8, 2, 2};
double heaviest = 0;
double normal = 0;
double heavy = 0;
double totalCost;
int repeatCount=0;
for (double d : boxes) {
heaviest = Math.max (boxes[i], heaviest);
}
for (double d : boxes) {
if(d == heaviest) {
repeatCount++;
}
}
System.out.println("Count: " + repeatCount);
for (double d : boxes) {
if (d == heaviest) {
heavy += d * 2.0;
} else {
heavy += d * 3.5;
}
}
totalCost = normal+heavy;
System.out.println("Total cost of the insuranse is: " + totalCost);
}
根据您的知识,这是在遵循您的代码,但 已修复 一点。您永远不需要使用 i
,也不需要将结果存储在 a
或 b
中,而是可以使用 +=
运算符。
据说 double d1 == double d2
使用起来很危险。我不建议直接使用它们。阅读 this article or this。实际上,我建议您都阅读。
public static void main(String[] args) {
double [] boxes;
boxes = new double[] {20, 10, 5, 40, 20, 41, 41, 2, 6, 7, 3, 4, 5, 6, 23, 34, 7, 8, 2, 2};
double heaviest = 0;
double normal = 0;
double heavy = 0;
double totalCost;
double a = 0;
double b = 0;
int repeatCount=0;
for (int i = 1; i < boxes.length; i++) {
if (boxes[i] > heaviest)
heaviest = boxes[i];
}
for(double element: boxes) {
if(element==heaviest) {
repeatCount = repeatCount+1;
}
}
System.out.println("Count :" +repeatCount);
for (int j =0; j<boxes.length; j++) {
if (boxes[j] < heaviest) {
a = boxes[j] * 2;
normal = normal+a;
} else {
b = (boxes[j] * 3.5);
heavy = heavy+b;
}
}
totalCost = normal+heavy;
System.out.println("total cost of the insuranse is "+ totalCost);
}
第 1 部分: 我需要将最大的元素乘以 3.5
并与 2
相加,然后将值相加得到总和。
第 2 部分: 另外我想要最大元素出现的次数。 OR我们也可以将最大的元素存储在另一个数组中。
在我的代码中,我完成了第 1 部分,对于第 2 部分,我计算了最大元素的出现次数。
我的问题:
如果有超过 1000
个元素,是否有任何其他方法可以减少编译时间或使代码更优化?
我也尝试通过将数组转换为列表来使用 Collections.frequency(myArray, largestElement)
。
一如既往,正确性比性能更重要。
不确定为什么在寻找最重的时候会忽略第一个框。
您可以减少代码,但最大的问题是您的代码 运行 不够长,无法被 JIT 编译。即便如此,与 Java.
的启动成本相比也是微不足道的总之,除非你的程序持续几百毫秒,否则我不会担心性能。
顺便说一句,您可以使用单个循环来缩短代码,但就像我说的那样,在这种情况下不会有太大区别。
我可能会这样写。
double[] boxes = {20, 10, 5, 40, 20, 41, 41, 2, 6, 7, 3, 4, 5, 6, 23, 34, 7, 8, 2, 2};
double heaviest = -1;
int count = 0;
double sum = 0;
for (double box : boxes) {
sum += box;
if (box > heaviest) {
count = 1;
heaviest = box;
} else if (box == heaviest) {
count++;
}
}
// double total = sum * 2 - heaviest * count * 2 + heaviest * count * 3.5;
double total = sum * 2 + heaviest * count * 1.5;
System.out.println("total: " + total);
注意:只有一个循环。你可以边走边算出计数和总和。
public static void main(String[] args) {
double [] boxes = new double[] {20, 10, 5, 40, 20, 41, 41, 2, 6, 7, 3, 4, 5, 6, 23, 34, 7, 8, 2, 2};
double heaviest = 0;
double normal = 0;
double heavy = 0;
double totalCost;
int repeatCount=0;
for (double d : boxes) {
heaviest = Math.max (boxes[i], heaviest);
}
for (double d : boxes) {
if(d == heaviest) {
repeatCount++;
}
}
System.out.println("Count: " + repeatCount);
for (double d : boxes) {
if (d == heaviest) {
heavy += d * 2.0;
} else {
heavy += d * 3.5;
}
}
totalCost = normal+heavy;
System.out.println("Total cost of the insuranse is: " + totalCost);
}
根据您的知识,这是在遵循您的代码,但 已修复 一点。您永远不需要使用 i
,也不需要将结果存储在 a
或 b
中,而是可以使用 +=
运算符。
据说 double d1 == double d2
使用起来很危险。我不建议直接使用它们。阅读 this article or this。实际上,我建议您都阅读。