循环是否一定该合并?(转载)

摘自《游戏之旅--我的编程感悟》

程序1:
for (int i = 0; i < 100; i++)
{
   do_something_1();
   do_something_2();
}

程序2:
for (int i = 0; i < 100; i++)
{
   do_something_1();
}

for (int i = 0; i < 100; i++)
{
   do_something_2();
}

    如果do_something_1()和do_something_2()这两个函数没有关联, 则程序1和程序2的运行结果相同.哪个程序更好?  或许有很多讲究效率的程序远喜欢第一种, 很多人喜欢在一个for循环中干太多的事情, 或许他们想当然的认为, for循环累加i也是一种时间消耗, 如果能减少对i的操作也是一种优化.但实际上事与愿违,两段程序的性能比较取决于do_something_1和do_something_2的具体实现.

    如果两个函数都实现的很简单, 则通常程序1会比较有效率.而如果两个函数都干了较为复杂的事情,那么程序2会变得比程序1高效.导致这个结果的是cpu的代码cache机制.通常, 程序代码第一次运行的时候,速度会比较慢(比如for循环的第一次进入).这存在一个代码从内存加载的时间,代码用到的内存数据的加载时间、还有分支预测缓存的建立,甚至还有cpu对指令的解码时间(对于现代cpu, 为了兼容以前的指令集且保持高效率,在内部需要使用一套高效的微操作指令的同时,需要做从外部的指令编码到内部微指令的转换工作)。如果循环体内涉及到的代码超过了cpu的代码缓存的容量(通常是8k,到p4加到了16k),就使的循环中代码每次的进入都要重新作一系列缓慢的操作,如果我们能尽量维持循环内的代码在一个较小的尺寸,就能提高效率。

    如果do_something_1()和do_something_2()干的事情逻辑上联系不大,仅仅是想把两个函数各自循环调用若干次,则从软件设计角度讲,程序1也是个糟糕的设计。

“循环是否一定该合并?(转载)”的5个回复

  1. 这个东西,我觉得如果do_something_1()和do_something_1()耦合度不是太高,那么应该写成两个函数:voidFun1()for(inti0ilt100i )do_something_1()voidFun2()for(inti0ilt100i )do_something_2()然后调用这两个函数Fun1()Fun2()

  2. 我不觉得调用两个函数有什么好啊,况且函数调用还会占用不少空间,你能解释一下吗screen.width2)this.style.widthscreen.width2

  3. 访客847450的意思是,不要增加函数设计的耦合,简单一点说就是:一个函数只干一件事情,将两件不相关的事情给一个函数干,会带来不必要的耦合。

  4. 访客847450的意思是,不要增加函数设计的耦合,简单一点说就是:一个函数只干一件事情,将两件不相关的事情给一个函数干,会带来不必要的耦合。

匿名博友进行回复 取消回复

您的电子邮箱地址不会被公开。