0

count 变量的值将仅为 0 或 1 或 2

以下是我要实现的目标如果计数为 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...");
        }

我想知道哪个更好以及为什么。

4

3 回答 3

4

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

于 2013-03-07T15:37:31.683 回答
1

我认为关注的是性能,因为从代码可读性和可维护性的角度来看,for-loop 版本显然以压倒性优势获胜。

如果循环体中的代码与 println 调用一样长,那也没关系。

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

if 版本可能会导致比 for 循环更不常见的条件分支模式。硬件分支预测可能更适用于在设计时使用的基准测试中经常出现的常见习语。

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

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

如果你的程序的性能真的取决于这个循环的编写方式,你应该对它进行基准测试。由于依赖于硬件分支预测的细微之处,我建议在尽可能多的不同处理器上对每个版本的程序进行基准测试。如果这对您的程序性能来说还不够关键,不足以证明这种努力是合理的,请坚持使用 for 循环。

于 2013-03-07T16:12:35.877 回答
1

这取决于实际的要求。

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

如果不是,则取决于差异的性质,差异的数量(例如,是否存在单个特殊情况,多个特殊情况,是否可以计算特殊情况等)

您希望代码具有多大的可扩展性也很重要。

于 2013-03-07T15:37:50.487 回答