这是我的代码;
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 是实现同样工作的两种方式。我不知道哪个在执行速度和写作风格方面做得很好。
你可以帮助我吗。
答案 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)
我会选择。