哪个代码的性能更好?

时间:2011-08-03 11:43:28

标签: java performance

我有两个相同的条件,我想知道哪些表现良好?

if(str_final.charAt(str_final.length() -1) == 'a'
    || str_final.charAt(str_final.length() -1) == 'b' )
{
    // body 
}

-------------------- OR --------------------

char temp = str_final.charAt(str_final.length() -1);
if( temp == 'a' || temp == 'b')
{
    // body
}

9 个答案:

答案 0 :(得分:2)

第二个版本是微小的更快。

<强>原因:
2方法调用较少(如果它不以'a'结尾) 但两者都不会超过return variable;

  • charAt()只是对数组的访问权,
  • 字符串的length()也已预先计算。

答案 1 :(得分:1)

第二个代码是更好的选项,因为str_final.charAt(str_final.length() - 1)在最坏的情况下也只执行一次。

char temp = str_final.charAt(str_final.length() -1);

if( temp == 'a' || temp == 'b')
{
  // body
}

在另一种情况下,str_final.charAt(str_final.length() - 1)必须执行两次。

答案 2 :(得分:1)

它可能是相同的性能,因为优化编译器(或者只是及时编译器/热点)可以在编译时将第一个版本更改为第二个版本。

答案 3 :(得分:1)

我会选择第二个选项,因为它更容易阅读。此外,str_final.length()str_final.charAt()只会被调用一次。

此外,不要调用字符temp,而是将其称为更有意义的内容,例如lastChar

如果要检查的字符数不止两个,您甚至可以考虑使用switch语句:

char lastChar = str_final.charAt(str_final.length() -1);
switch (lastChar) {
  case 'a':
  case 'b':
    //do something
    break;
  case 'c':
    //something else
    break;
  case 'd':
    //something else
    break;
}

答案 4 :(得分:0)

第二段代码更快,因为.charAt.length()仅评估一次。正如其他人指出的那样,可读性显然更为重要,这也有利于第二种解决方案。

答案 5 :(得分:0)

这是一个问题吗?我当然更喜欢第二种结构,因为它更具可读性,而且可能性能更好。

编译器可以轻松地优化临时变量,但无法确定函数调用是否具有副作用。因此,双功能调用无法针对单个调用进行优化。

答案 6 :(得分:0)

第二个不能慢,所以我想我会说第二个,因为它至少避免了方法调用。但是,JIT将内联这一点。除非这是一个非常紧凑的循环,否则性能差异几乎可以忽略不计。

我个人觉得 second 也更具可读性(也许你可以调用变量而不是'temp')。所以我会基于这些理由投票。但这是我认为更好的问题:哪个更清楚?当你有任何理由相信这是代码很重要时担心性能。

答案 7 :(得分:0)

第二个选项会更快,也更易读,但使用“temp”

之外的其他名称会更好

答案 8 :(得分:0)

第二版更好,虽然它的性能比第一版小,但它也有几个优点 1.可读性 2.维护 - 对于这种类型的代码,假设您必须检查更多条件(比如10),然后更改逻辑,只需一个地方。