2012-05-17 52 views
0

我写一个方法,并想知道如果附带的代码是有效取决于它是怎么写的:高效的编程技术

public boolean isThreeOfKind(PlayingCard[] hand) 
    { 
//   if(hand[0].getRank() == hand[2].getRank()) 
//    return true; 
//   else if(hand[1].getRank() == hand[3].getRank()) 
//    return true; 
//   else if(hand[2].getRank() == hand[4].getRank()) 
//    return true; 

     return (hand[0].getRank() == hand[2].getRank() || 
       hand[1].getRank() == hand[3].getRank() || 
       hand[2].getRank() == hand[4].getRank()); 
    } 

所以你可以看到我有一个if else if语句可评论out和return语句基本上做同样的事情,根据编码标准,这会更有效率吗?

+7

可读性远在这种情况下,比效率更有价值。使用哪个更容易理解。 – Jeffrey

+3

在遥远的土地和语言中,逻辑操作比分支要快得多。但现代编译器已经把我们全部变成了代码猴,所以只需使用任何漂浮在你的船上的东西。 – Perception

+0

嗯看起来像'手'中的'玩牌'更好地按价值排序。花了我一分钟来弄清楚这将是'一种三'。只是说' –

回答

9

效率没有区别,但风格明显不同,第二个更好。然而,这种特殊的逻辑真的只是

for (int i = 0; i < 3; i++) 
    if (hand[i].getRank() == hand[i+2].getRank()) return true; 
return false; 
+0

这个实现也将规模过去[0 ... 4]。 +1 –

+0

我特别喜欢它,因为它更清楚代码在做什么 - 将升序系列的第i个成员与第(i + 2)个nd成员进行比较以确认三种类型。暗示升序系列(卡片排序),否则这将不起作用 - 这是现在另一个显而易见的事情(任何错误将更容易识别)。 –

3

这种类型的问题可能会在CodeReview更好,因为它更发表意见。但在我看来,阅读非评论部分要容易得多,性能不应该担心,直到它成为一个问题(尤其是像这样的事情)。有关更多信息,请参阅Wikipedia上的程序优化文章,特别是When to Optimize部分。

0

正如杰弗里所说,我认为在这种情况下可读性比效率更有价值(我不会说这是一条通用规则)。

您可能会对Short-Circuit Evaluation这个概念感兴趣。请注意,||是Java中的短路操作员。因此,如果第一条语句为真(其他两条不会被评估),您将获得与if语句相同的效果。这就是说,我不确定这两位代码是否编译成了相同的函数(它们可能取决于编译器的实现)。 如果它们编译不一样,第二个可能会更快。

+0

你如何看待?我无法想象会有什么不同,除非注释掉的解决方案可能会更快,如果在所有这些出口点重复执行返回,未注释的版本可能会跳到最后的公共出口点,其结果是然后共同创建“真”。 –

+0

这就是短路评估的要点。如果第一个为真,那么Java不会评估第二个实现中的第二个元素,就像if语句一样。 编辑:我说这可能是慢的原因是因为我不知道什么机器代码“if”语句编译进去。我的猜测是,这两个陈述会编译相同,但我不积极。 – user986122

0

或者,如果你在方法和数组边界检查宁愿只有一个出口点:

boolean found = false; 
for (int i = 0; !found && i < hand.length - 2; i++) 
    found = (hand[i].getRank() == hand[i + 2].getRank()); 
return found;