需要澄清代码效率

时间:2011-03-28 11:29:03

标签: optimization performance

这是我的代码;

  int arr[10]={1,2,3,4,5,6,7,8,9,10}; 
  // I need to do some operation using arr[i] if i!=2   

一个。

  for( int i =0;i<10;i++)
  {
      if(i!=2)
          do some work using arr[i];
  }

  for(int i=0;i<10;i++)
  {
      do some work using arr[i]; 
  }

  undo the work done for arr[2];

a &amp; b 是实现同样工作的两种方式。我不知道哪个在执行速度和写作风格方面做得很好。

你可以帮助我吗。

5 个答案:

答案 0 :(得分:1)

在您提供的两个选项中,我更愿意a)。 if句子不会花费太多(这取决于你的SomeWork执行时间,原因)。并且b)只有在撤消操作时才会起作用。

相反,你可以这样做:

SomeWork(arr[0]);  // Could be made to an loop from 0 to j
SomeWork(arr[1]);  // if it should work for general purposes

for (int i = 3; i < 10; i++)
    SomeWork(arr[i]);

这至少会有效:)

答案 1 :(得分:1)

我不知道为什么你会想要通过一个完整的for循环然后返回并撤消for循环的一个子集。

在选项A中,您正在迭代操作并检查条件以确定是否应该执行操作。此检查将减少执行您不必要的任何操作的开销。因此,在选项B中,您已经完成了不必要的工作,您必须返回并撤消,并且您仍然必须检查条件,仅在撤消部分而不是do部分。通过撤消,您将添加在代码中引入错误的机会,以及基本上执行整个功能11次(10次和1次撤消)而不是选项A中的9次。

选项'a'在这里是显而易见的选择,跳过与条件匹配的值的操作。

答案 2 :(得分:1)

一如既往,这取决于。

如果“做一些工作”与循环执行本身相比花费了大量时间,请使用选项a)。

如果“做一些工作”非常简单,比如添加1,则选项b)应该更快,因为循环在没有条件的情况下均匀运行,因此对管道更友好。

第三个选项是在循环之前重新排序数组(因此“工作” - 指示是连续的)并在之后撤消重新排序。这种方式可以带来两种选择的优势。

第四:也许编译器会为你做一些优化。例如,它可以将循环分成两个循环,一个用于小于2的元素,第二个用于大于2的元素。

选项的相对优势还取决于代码运行的体系结构。如果选择不明显且性能差异真的很重要,则必须衡量选项并选择更好的选项。

答案 3 :(得分:1)

你在做什么通常被称为for-if反模式(实际上是它的教科书示例),只需将循环分成两个或多个部分就可以轻松解决,这将是最有效的解决方案无论如何。

您提出的两个解决方案的效率更高,主要取决于执行的CPU以及撤消的工作量。 x86有一个非常好的分支预测单元,而其他CPU(例如旧ARM)根本没有,所以根据创建的代码,你可能会在每次循环迭代时得到一些停顿的循环。因此,每个人在这里提出一般解决方案都会进行概括:)

答案 4 :(得分:0)

  • a)一个比较,没有工作
  • b)工作,然后更多的工作来撤消原来的工作。

我会选择。