Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 代码效率需要澄清吗_Optimization_Performance - Fatal编程技术网

Optimization 代码效率需要澄清吗

Optimization 代码效率需要澄清吗,optimization,performance,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 a. 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 usi

这是我的密码

  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   
a.

  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];

for(inti=0;i在您提供的两个选项中,我更喜欢a)。如果一句话花费不多(当然,这取决于你的
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]);
SomeWork(arr[0]);//可以在0到j之间形成一个循环
一些工作(arr[1]);//它是否应该用于一般目的
对于(int i=3;i<10;i++)
一些工作(arr[i]);

这至少是有效的:)

在您提供的两个选项中,我更喜欢a)。如果一句话花费不多(当然,这取决于你的
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]);
SomeWork(arr[0]);//可以在0到j之间形成一个循环
一些工作(arr[1]);//它是否应该用于一般目的
对于(int i=3;i<10;i++)
一些工作(arr[i]);

这至少是有效的:)

我不知道为什么您要遍历整个for循环,然后返回并撤消for循环的子集

在选项A中,您迭代一个操作并检查一个条件,以确定是否应该执行该操作。与执行任何不必要的操作相比,此检查的开销更小。因此,在选项B中,您已经做了不必要的工作,您必须返回并撤消这些工作,并且您仍然必须检查您的条件,仅在撤消部分而不是do部分。有了撤销,您就增加了在代码中引入bug的机会,加上您基本上要执行整个功能11次(10次撤销和1次撤销),而不是选项A中的9次


选项“a”在这里是一个明显的选择,跳过与条件匹配的值的操作。

我不知道为什么您要遍历整个for循环,然后返回并撤消for循环的子集

在选项A中,您迭代一个操作并检查一个条件,以确定是否应该执行该操作。与执行任何不必要的操作相比,此检查的开销更小。因此,在选项B中,您已经做了不必要的工作,您必须返回并撤消这些工作,并且您仍然必须检查您的条件,仅在撤消部分而不是do部分。有了撤销,您就增加了在代码中引入bug的机会,加上您基本上要执行整个功能11次(10次撤销和1次撤销),而不是选项A中的9次

选项“a”是这里的明显选择,请跳过与条件匹配的值的操作。

  • a) 一个比较,没有工作
  • b) 工作,然后更多的工作,以撤销原来的工作
我会选择a.

  • a) 一个比较,没有工作
  • b) 工作,然后更多的工作,以撤销原来的工作
我会选择a.

一如既往,这要看情况而定

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

如果“dosomework”非常简单,比如添加1,那么选项b)应该更快,因为循环在没有条件的情况下统一运行,因此对管道更友好

第三个选项是在循环之前对数组重新排序(因此“工作”索引是连续的),然后撤消重新排序。这种方式可以兼有两种选择的优点

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

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

一如既往,这取决于具体情况

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

如果“dosomework”非常简单,比如添加1,那么选项b)应该更快,因为循环在没有条件的情况下统一运行,因此对管道更友好

第三个选项是在循环之前对数组重新排序(因此“工作”索引是连续的),然后撤消重新排序。这种方式可以兼有两种选择的优点

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


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

您在那里做的工作通常被称为for-If反模式(实际上是教科书上的例子),只需将循环分成两个或多个部分即可轻松解决,这将是最有效的解决方案


在两个建议的解决方案中,哪一个更有效主要取决于执行该解决方案的CPU以及撤消的工作量。x86有一个非常好的分支预测单元,而其他CPU(如较旧的ARM)根本没有分支预测单元,因此根据创建的代码,您可能会在每次循环迭代中遇到一些暂停周期。因此,这里提出一般解决方案的每个人都会进行归纳:)

您在那里所做的工作通常被称为for-if反模式(实际上是教科书上的例子),只需将循环分成两个或多个部分就可以轻松解决,这将是最有效的解决方案

在两个建议的解决方案中,哪一个更有效主要取决于执行该解决方案的CPU以及撤消的工作量。x86具有极其强大的功能