考虑到干净的代码和应用性能,哪种实现更好?



第一个选项不会每次都创建一个新对象,但可读性较差。其次,创建一个对象,但看起来很干净。池列表大小约为 20-28。你会选择哪一个?

for (int i = 0; i < poolList.getPoolList().size(); i++){
if (isTaskExecutable(poolList.getPoolList().get(i).getName()))
callableList.add(new ConnectToApiCallable(this.appendPoolApiUrl(poolList.getPoolList().get(i)), poolList.getPoolList().get(i).getName(), poolList.getPoolList().get(i).getType()));
else
continue;
}

for (int i = 0; i < poolList.getPoolList().size(); i++){
PoolDefinition poolDefinition = poolList.getPoolList().get(i);
if (isTaskExecutable(poolDefinition.getName()))
callableList.add(new ConnectToApiCallable(this.appendPoolApiUrl(poolDefinition), poolDefinition.getName(), poolDefinition.getType()));
else
continue;
}

第二个选项不会创建新对象。它只是在poolList.getPoolList().get(i)处创建对现有对象的堆栈引用。这样,您就不必重复承担调用poolList.getPoolList().get(i)以获取同一对象的开销。

因此,第二种选择实际上比第一种更干净更快。

事实上,我不明白为什么第二个选项会更快,所以我做了这个模拟类似场景的测试:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Person {
private String name;
private int age;
private List<Person> friends;
public Person(String name, int age) {
this.name = name;
this.age = age;
friends = new ArrayList<>();
}
public void addFriend(Person person) {
friends.add(person);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public List<Person> getFreinds(){
return friends;
}

public static void main(String[] args) {
char[] alphabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
Random rand = new Random();
List<Person> people = new ArrayList<>();
for(int i=0; i<1000000; i++) {
String name = "";
for(int j=0; j<10; j++) {
name += alphabet[rand.nextInt(26)];
}       
people.add(new Person(name, rand.nextInt(60)+10));
}

Person person = people.get(0);
for(Person p : people) person.addFriend(p);

final long startTime1 = System.currentTimeMillis();
for (int i = 0; i < person.getFreinds().size(); i++){
person.getFreinds().get(i).getAge();
person.getFreinds().get(i).getName();
}
final long endTime1 = System.currentTimeMillis();
System.out.println("First Option Using Method Chaining: " + (endTime1-startTime1) + " Milliseconds");

final long startTime2 = System.currentTimeMillis();
for (int i = 0; i < person.getFreinds().size(); i++){
Person friend = person.getFreinds().get(i);
friend.getAge();
friend.getName();
}
final long endTime2 = System.currentTimeMillis();
System.out.println("Second Option Using Local Object: " + (endTime2-startTime2) + " Milliseconds");
}
}

输出

First Option Using Method Chaining: 20 Milliseconds
Second Option Using Local Object: 17 Milliseconds

结论

该测试对一百万个元素进行了测试,并重复了很多次,得出相同的结果: 事实上,两个方法调用将花费更多的时间。

最新更新