2013-03-07 119 views
0

计数变量的值将是0或1或2只“for循环”只循环一次或两次。是否更好的选择?

下面是什么,我想实现 如果计数为1,只做一次,如果2做点什么两次

这是一个更好的解决方案

 for(int j=0;j<count;j++){ 
      System.out.println("PRINTING..."); 
     } 

或本

 if(count==1){ 
      System.out.println("PRINTING..."); 
     }else if (count==2){ 
      System.out.println("PRINTING..."); 
      System.out.println("PRINTING..."); 
     } 

我想知道哪一个更好和W HY。

+2

for循环更好。您可能会在将来更改需求,并需要添加3+的计数。不想复制粘贴'System.out ...'并添加'else-if' – 2013-03-07 15:36:14

+1

坚持干(不要重复自己),我会选择第一个。 – nhahtdh 2013-03-07 15:36:40

+0

“更好”是否意味着“更快”? – 2013-03-07 15:38:45

回答

4

显然是第一个。 不要重复自己! 这个循环展开似乎是过早优化的严重情况。

1

这取决于实际要求。

如果“做什么”对于每次迭代总是相同的事情,显然该循环更好。

如果不是,则它依赖于的差异的性质,差的数量(例如,是否有一个单一的特殊情况下,多个特殊情况下,可以计算出特殊情况下,等)

它也很重要如何可扩展 - 无需更改您想要的代码。

1

我假设担心的是性能,因为从代码可读性和可维护性的角度来看,for-loop版本显然赢得了压倒性优势。

如果循环体中的代码与println调用一样长,则无关紧要。

如果循环体非常小且快,那么主要成本将是任何错误预测的条件分支或缓存未命中。如果硬件在将条件分支载入流水线后猜测下一条指令有误,则必须在分支到达执行阶段后清空整个流水线。这真的花了钱。

if版本可能会导致比for循环更不常见的条件分支模式。硬件分支预测可能会更好地处理在设计时使用的基准测试中常见的习惯用法。

当处理器将数据转换为执行逻辑时,高速缓存未命中会导致暂停。 if版本比较长,因为它有三个循环体,所以指令缓存未命中的风险较高。他们使用相同的数据,因此他们同样可能会遇到数据缓存未命中。

我的猜测是,如果有任何可测量的差异,for-loop版本可能会更快。这只是一个猜测。

如果你的程序的性能真的取决于这个循环的写法,你应该对它进行基准测试。由于依赖于硬件分支预测的微妙之处,我建议在尽可能多的不同处理器上对每个版本的程序进行基准测试。如果这不足以证明你的程序能证明这一点,那么坚持使用for循环。