什么时候不要分解公共代码

时间:2014-06-02 19:17:31

标签: java

我应该交换代码紧凑性以获得一点性能吗? 具体来说,以下两个中的哪一个更可取:

// case 0:
final boolean flag = <some condition>;
for (int i = 0; i < SOME_COUNT; ++i)
{
    if (flag)
    {
        // do foo
    }
    else
    {
        // do bar
    }

}

// case 1:
final boolean flag = <some condition>;
if(flag)
{
    for (int i = 0; i < SOME_COUNT; ++i)
    {
        // do foo
    }
}
else
{
    for (int i = 0; i < SOME_COUNT; ++i)
    {
        // do bar
    }
}

3 个答案:

答案 0 :(得分:5)

喜欢前者。尽管如此,JIT能够使第一个与第二个一样快。

具有表现的经验法则:如有疑问,请进行衡量。当您决定衡量时,请先阅读:How do I write a correct micro-benchmark in Java?

答案 1 :(得分:4)

考虑到flag属性常量非易失性,我会选择第二个选项。

为什么你会花时间检查病情,你已经知道了结果?

只需在开头检查一次,然后做你的事

请注意,您可能还需要执行一些依赖于标记值的操作,并且需要在for循环外部执行。

在第二种情况下,它就像在条件分支中添加新行一样简单

在第一种情况下,您需要检查for循环外的条件 AGAIN

答案 2 :(得分:0)

我选择0。 两件事:

  • 它更接近代码的意图(至少我是如何阅读你的问题,实际上是代码)。这将使得将来更容易维护代码 - 很难想象你提出的改变实际上会花多少时间,但我相信你节省开发的时间总是会超过你所节省的数量级。< / LI>
  • 其次,即时编译意味着你甚至可能不会在性能方面做出自己的帮助,因为如果案例1实际上更好并且做出相应的反应,那么java虚拟机可能会找到你。