时间复杂性就性能而言,在Java中,使用多个操作执行一个for或使用每个操作执行多个for会产生什么影响?
我关心的是提高源代码的可读性,它涉及到通过将大型方法分解为更小(简洁)的方法来减小它们的大小。简而言之,假设我有一个非常单一的方法,可以做很多不同的事情,例如:
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
。
因此,我的问题是:
- Java在执行或编译方面是否有一些优化李>
- 我应该关注这种性能问题吗李>
注意:我知道在渐进增长和大O表示法方面,我们应该忽略常量,但我只是想知道这种情况如何应用于Java
# 1 楼答案
如果您完成big-O分析,您将看到这两个选项都减少到
O(n)
。它们具有相同的复杂性它们可能没有相同的性能,但复杂性和复杂性分析(以及Big-O表示法)并不是用来衡量或预测性能的。事实上,对于足够小的
n
值,O(n)
算法可能比O(1)
算法性能更好对。JIT编译器(在运行时)进行大量优化。然而,我们无法预测选项1和选项2是否具有同等的性能
是和否
这取决于性能对项目是否/有多重要对于许多项目而言,应用程序性能与其他项目相比并不重要;e、 g.满足所有功能要求,始终计算正确答案,不崩溃,不丢失更新等
当性能是一个问题时,不一定是>;这<;代码片段(代码库中的数百行、数千行、数百万行)值得优化。并非所有代码都是相等的。如果此代码只是偶尔执行,那么优化它可能对总体性能的影响最小
标准咒语是避免过早优化。等到你的代码正常工作。然后创建一个基准,用于测量应用程序在执行实际工作时的性能。然后分析运行基准测试的应用程序,找出代码的哪些部分是性能热点。。。并将优化工作重点放在热点上
1-重点是必须在项目的所有其他要求和约束的背景下考虑性能。如果你过早地在绩效上花费太多时间,你很可能会错过最后期限,等等。更不用说在优化错误代码上浪费精力了