我目前正在使用一个大容器,我需要迭代做很多事情。以下哪一种被认为是更好的风格?
a)大循环:
for (container::iterator it = myContainer.begin(); it < myContainer.end(); ++it) {
// do thing a with *it
// do thing d with *it
// do thing c with *it
// do thing b with *it
}
b)小圈:
for (container::iterator it = myContainer.begin(); it < myContainer.end(); ++it) {
// do thing a with *it
}
for (container::iterator it = myContainer.begin(); it < myContainer.end(); ++it) {
// do thing b with *it
}
for (container::iterator it = myContainer.begin(); it < myContainer.end(); ++it) {
// do thing c with *it
}
for (container::iterator it = myContainer.begin(); it < myContainer.end(); ++it) {
// do thing d with *it
}
我发现b)更好阅读,因为a)将变得笨重,真的很容易理解。但是a)我认为会跑得更快。那么哪些是更好的风格? myContainer将包含多达10.000个元素,并且必须重复此过程,因此性能非常重要。
答案 0 :(得分:3)
将单独的任务拆分为不同的循环还有进一步的重构优势。
在处理大数据集时,循环性能始终非常直接,因此您通常应该从可读性开始,并在需要时返回单循环。
马丁福勒在这里Split Loop refactoring example。
你经常会看到一次做两件不同事情的循环,因为 他们可以通过循环一次完成。确实大多数程序员 这种重构会让你觉得非常不舒服 执行循环两次 - 这是工作的两倍。
但是像许多优化一样,在一个循环中做两件事 不像分开做的那么清楚。它也会导致问题 进一步重构,因为它引入阻碍的临时性 进一步的重构。因此,在重构时,不要害怕摆脱 循环。优化时,如果循环缓慢,则会显示 并且在那个时候将环回到一起是正确的。您 可能会惊讶于循环不是一个瓶颈,或者是如何 后来的重构打开了另一个更强大的优化。
void printValues() {
double averageAge = 0;
double totalSalary = 0;
for (int i = 0; i < people.length; i++) {
averageAge += people[i].age;
totalSalary += people[i].salary;
}
averageAge = averageAge / people.length;
System.out.println(averageAge);
System.out.println(totalSalary);
}
void printValues() {
double totalSalary = 0;
for (int i = 0; i < people.length; i++) {
totalSalary += people[i].salary;
}
double averageAge = 0;
for (int i = 0; i < people.length; i++) {
averageAge += people[i].age;
}
averageAge = averageAge / people.length;
System.out.println(averageAge);
System.out.println(totalSalary);
}
void printValues() {
System.out.println(averageAge());
System.out.println(totalSalary());
}
private double averageAge() {
double result = 0;
for (int i = 0; i < people.length; i++) {
result += people[i].age;
}
return result / people.length;
}
private double totalSalary() {
double result = 0;
for (int i = 0; i < people.length; i++) {
result += people[i].salary;
}
return result;
}
答案 1 :(得分:2)
您应该使用单循环。您可以将循环中包含的代码重构为单独的函数。
将大循环拆分成四个较小的循环是相当低效的,它增加了多余的操作。