什么是归还物品的最佳方式?

4

如果我有一个返回结果的函数,以下哪种方式是最好的呢?是否有更好的格式化方法?是否有更好的性能表现?

  private int myfunc()
{
    int value=0;
    for(int i=0;i<5;i++)
    {
        if (i==2)
            value= 2;
    }

    return value;
}

或者

 private int myfunc()
{

    for(int i=0;i<5;i++)
    {
        if (i==2)
            return(2);
    }

   return (0);
}

2
你是怎么想到它们的性能会不同的?你有进行过测试吗? - Greg Hewgill
1
@GregHewgill 我认为他是在问是否存在性能差异(显然是有的,尽管很小),而不是在陈述他认为存在性能差异。 - Dave Newton
@GregHewgill 我绝对不认为没有性能影响是显而易见的,特别是如果我们将这个问题看作是关于一种模式而不是这几行代码。当然,在使用一个天真的编译器或关闭优化时,会有性能影响。 - Charlie Martin
@GregHewgill 在Ubuntu上默认的Java甚至对于人为构造的示例(字节码级别;而不是JIT编译的代码)也不支持。 - Dave Newton
1
这是一场圣战和微观优化。请阅读Steve McConnell的《代码大全》以获取有关两种选项的定性论据。 - orangepips
显示剩余2条评论
6个回答

3

我更倾向于第二种方法。

无论哪种方式,如果您在第一种方法的实现中通过'break'来终止循环以找到您想要的项目,则不会注意到任何性能差异。

不必要声明变量是一个好的程序设计实践。您在第二种方法中所做的就是这方面的好方法。而且第二种方法不会执行for循环中的所有周期。因此,又有一个好点。

如果你对第一种方法做到这一点,两者几乎执行相同,除了在第一种方法中声明了不必要的变量。第一种方法为垃圾收集器提供了一些工作,这在第二种方法中不会发生。

for(int i=0;i<5;i++)
    {
        if (i==2)
        {
            value= 2;
            break;
         }
    }

2

根据我的个人经验,第二种方法更好,因为它可以更快地到达返回语句。它不必通过i=3至i=5的循环,所以它会运行得更快。当你只是返回一个值而不是保留它一段时间时,这也会更清晰易懂。当你的代码变得更加复杂时,这一点尤其重要。


2

这实际上是在“结构化编程”中一个古老的宗教问题的边缘:你应该让你的代码只有一个出口,还是允许有多个出口?

至少在C/C++/Java世界中,一旦你知道答案,就立即返回最为常见。虽然这会带来一些微小的性能影响,但与20年前相比远不及那么大。


1

第二种方法不能直接编译,你需要添加:

return 0;

作为方法的最后一行。

话虽如此,第二种方法应该会稍微快一些,因为执行的代码行数较少。

通常情况下,尽量将方法中的返回语句数量限制在最多6个以内。

请注意,编译器允许并且可能会将第一种方法转换为字节码中的第二种方法(变量value在循环后没有被使用,因此编译器可以简单地返回它)。


我会将修复添加到代码中。 - user979490

1
如上述用户所说,添加return 0;以便IDE知道程序是否成功运行。

0

如果你喜欢在编程中变得更加纯粹,那么你会喜欢第一种方法

其中一个原因是continuebreak不是编写代码的好选择。始终有可能在不使用continuebreak的情况下编写代码。保持你的注意力在代码上,确切地了解每个部分正在做什么以及其范围。

从块中返回也是可能的,但这与使用continuebreak是相同的事情。

当然,从块中return并不是坏事。但从方法末尾return是良好的实践。


你在这里提出了许多断言,但我没有看到任何支持它们的证据。 - Caleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接