什么被认为是更好的风格?一个大循环或多个小循环?

时间:2012-06-22 14:42:48

标签: coding-style

我目前正在使用一个大容器,我需要迭代做很多事情。以下哪一种被认为是更好的风格?

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个元素,并且必须重复此过程,因此性能非常重要。

2 个答案:

答案 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)

您应该使用单循环。您可以将循环中包含的代码重构为单独的函数。

将大循环拆分成四个较小的循环是相当低效的,它增加了多余的操作。