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具有极其强大的功能