2011-08-03 74 views
0

我有两个相同的条件,我想知道哪些是在perfomance?哪个代码的性能比较好?

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 
} 
+8

真正的问题是哪些是可读性? :) –

+12

谈论可读性......如何...'.endsWith(“a”)'? – giraff

+2

关注性能这样一个微小的细节就像用剪刀修剪草坪。 – Jacob

回答

0

第二个选项是速度更快,也更具可读性,但最好使用一些其他的名字不是“临时”

2

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

原因:
2方法调用较少(如果它不以'a'结尾)。
但两者并不远不止return variable;

  • charAt()只有一个阵列的存取,并
  • 字符串的length()已经预先计算为好。
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)必须被执行两次。

0

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

+0

我很好奇,通过两次调用'charAt'和'length'来找出HotSpot发出的机器代码是什么...... –

+0

好问题,虽然... –

0

这是一个疑问吗?我当然会更喜欢第二个构造,因为它更可读,可能表现更好。

编译器可以轻松地优化临时变量,但无法确定函数调用是否有副作用。所以双函数调用不能优化为单个调用。

1

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

+1

这是真的。即使不这样做,下一代编译器也可能会这样做。 –

0

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

我个人找到更具可读性,以及(也许如果你不同于“临时”其他变量的东西)。所以我会为此投票。但是我认为这是更好的问题:哪一个更清楚?如果您有任何理由相信这是代码问题,请关注性能。

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; 
} 
+0

显然我会叫它last_char,但就在这里我的名字是这样的...对不起:) – Vins

+0

在Java中,约定是使用camelCase – dogbane

0

第二个版本更好,虽然它具有比第一微小的性能外,还具有两个优点 1.可读性 2.维护 - 对于这种类型的代码,假设如果你要检查多个条件(说10),然后改变逻辑,只是一个地方。