gpt4 book ai didi

java - 就性能而言,在 Java 中执行一个 for 多个操作或多个 for 每个操作一个操作有何影响?

转载 作者:行者123 更新时间:2023-12-02 02:15:42 24 4
gpt4 key购买 nike

我关心的是提高源代码的可读性,它涉及通过将大型方法分解为较小(简洁)的方法来减少它们的大小。因此,简而言之,假设我有一个非常单一的方法,可以执行许多不同的操作,例如:

public void verHugeMethod(List<Person> people) {
for (Person person : people) {
totalAge += person.getAge();
totalHeight += person.getHeight();
totalWeight += person.getWeight();
// More calculations over class variables...
}
}

我想将方法​​更改为:

public void calculateTotalAge(List<Person> people) {
for (Person person : people) {
totalAge += person.getAge();
}
}

public void calculateTotalHeight(List<Person> people) {
for (Person person : people) {
totalHeight += person.getHeight();
}
}

public void calculateTotalWeight(List<Person> people) {
for (Person person : people) {
totalWeight += person.getWeight();
}
}
// More calculations over class variables...

我关心的是应用这种重构时的性能(时间和内存)。对于一小部分人来说,这当然不是问题,但我担心这个列表的渐近增长。

例如,对于更老式的 for 我可以看到以下影响:

// OPTION 1
public void method1() { // O(1) + O(3n)
int i = 0; // O(1)
while (int i < people.size()) { // O(n)
doSomething(people.get(i)); // O(1)
doAnotherThing(people.get(i)); // O(1)
i++; // O(1)
}
}

// OPTION 2
public void method1() { // O(2) + O(4n)
method1(); // O(1) + O(2n)
method2(); // O(1) + O(2n)
}
public void method2() { // O(1) + O(2n)
int i = 0; // O(1)
while (int i < people.size()) { // O(n)
doSomething(people.get(i)); // O(1)
i++; // O(1)
}
}
public void method3() { // O(1) + O(2n)
int i = 0; // O(1)
while (int i < people.size()) { // O(n)
doAnotherThing(people.get(i)); // O(1)
i++; // O(1)
}
}

我知道Java如何转换foreach指向iterables的指令。因此,我的问题是:

  1. Java 在执行或编译方面有一些优化吗?
  2. 我应该关心这种性能问题吗?

注意:我知道就渐近增长和 Big-O 表示法而言,我们应该忽略常量,但我只是想知道这种情况如何应用于 Java。

最佳答案

如果完成大 O 分析,您将看到这两个选项都会减少到 O(n)。它们具有相同的复杂性!

它们可能没有相同的性能,但是复杂性和复杂性分析(以及 Big-O 表示法)并不是用于测量或预测性能。事实上,对于足够小的 n 值,O(n) 算法可能O(1) 算法表现更好.


Does Java have some optimization in terms of execution or compiling?

是的。 JIT 编译器(在运行时)进行了大量优化。但是,我们无法预测选项 1 和 2 是否具有相同的性能。

Should I be concerned with this kind of performance question?

是和否。

这取决于性能对您的项目是否重要/有多重要。 对于许多项目1,与其他因素相比,应用程序性能并不重要;例如满足所有功能要求,始终计算正确答案,不崩溃,不丢失更新等。

当性能成为一个问题时,>这个片段(在代码库的数百、数千、数百万行中)不一定值得优化。并非所有代码都是平等的。如果此代码只是偶尔执行,那么对其进行优化可能对整体性能影响很小。


标准的口号是避免过早的优化。等待代码运行。然后创建一个基准来衡量应用程序在实际工作中的性能。然后分析运行基准测试的应用程序,找出代码的哪些部分是性能热点……并将优化工作集中在热点上。




1 - 要点是必须在项目的所有其他要求和约束的背景下考虑性能。如果你过早地在绩效上花费太多时间,你很可能会错过最后期限等等。更不用说浪费精力优化错误的代码了。








关于java - 就性能而言,在 Java 中执行一个 for 多个操作或多个 for 每个操作一个操作有何影响?,我们在Stack Overflow上找到一个类似的问题:

https://stackoverflow.com/questions/67214962/




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