关于程序中循环执行的有关问题。 多谢~

关于程序中循环执行的问题。 谢谢~~~
(1)
for   (row=0;   row <100;   row++)

{

  for   (   col=0;   col <5;   col++   )

      {
          sum   =   sum   +   a[row][col];
      }

}
(2)
for   (col=0;   col <5;   col++   )

{

    for   (row=0;   row <100;   row++)

      {  
            sum   =   sum   +   a[row][col];

        }
}

(3)for   (i=0;   i <N;   i++)

{

if   (condition)

        DoSomething();

else

        DoOtherthing();

}
 

(4)if   (condition)

{

  for   (i=0;   i <N;   i++)

        DoSomething();

}

else

{

      for   (i=0;   i <N;   i++)

        DoOtherthing();

}
 
程序在执行效率方面,(1)比(2)低,(4)比(3)高。请问,如何理解?谢谢啦!

------解决方案--------------------
代码要精确表明你的意图。效率对上面2个代码,没必要讨论。
------解决方案--------------------
你就回考官说:不要小看了编译器的优化能力。3、4在优秀的编译下得到的汇编代码是可以完全相同的。
------解决方案--------------------
计算时间复杂度

比如(1)和(2):sum = sum + a[row][col];都是500时间相同
1:col=0: 100, row=0: 1, row <100: 100, col <5: 500, ...
2:row=0: 5, col=0: 1, col <5: 5, row <100: 500, ...
比较一下就出来了
不过正像ls说的那些,没有必要细究,知道时间复杂度大概怎么算就可以了
------解决方案--------------------
这个可以很容易理解啊

1和2 的效率显然2高,有一个优化原则就是把循环次数最多的放到最内层
而且你这里用了数组,其对比就更明显。
其问题一是在于for循环的进入和赋初值所用时间,二是在于数组寻址时间,如果是大段连续空间,CPU的预读机制可以大大提高调用速度

3和4的对比显然更明显,if语句所占用的CPU时间是不容忽视的,前者显然调用了太多次的if语句而导致效率降低

------解决方案--------------------
晕~
《高效C++编写指南》上的例子啊!
【建议4-4-1】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。例如示例4-4(b)的效率比示例4-4(a)的高。



for (row=0; row <100; row++)

{

for ( col=0; col <5; col++ )

{

sum = sum + a[row][col];

}

}
for (col=0; col <5; col++ )

{

for (row=0; row <100; row++)

{

sum = sum + a[row][col];

}

}


示例4-4(a) 低效率:长循环在最外层 示例4-4(b) 高效率:长循环在最内层



l 【建议4-4-2】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。示例4-4(c)的程序比示例4-4(d)多执行了N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果N非常大,最好采用示例4-4(d)的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用示例4-4(c)的写法比较好,因为程序更加简洁。



for (i=0; i <N; i++)

{

if (condition)

DoSomething();

else

DoOtherthing();

}
if (condition)

{

for (i=0; i <N; i++)

DoSomething();

}

else

{

for (i=0; i <N; i++)

DoOtherthing();

}


表4-4(c) 效率低但程序简洁 表4-4(d) 效率高但程序不简洁


------解决方案--------------------