Java 哪个代码';s的表现更好吗?
我有两个相同的条件,我想知道哪一个表现良好Java 哪个代码';s的表现更好吗?,java,performance,Java,Performance,我有两个相同的条件,我想知道哪一个表现良好 if(str_final.charAt(str_final.length() -1) == 'a' || str_final.charAt(str_final.length() -1) == 'b' ) { // body } --------------------或-------------------- char temp = str_final.charAt(str_final.length() -1); if( temp
if(str_final.charAt(str_final.length() -1) == 'a'
|| str_final.charAt(str_final.length() -1) == 'b' )
{
// body
}
--------------------或--------------------
char temp = str_final.charAt(str_final.length() -1);
if( temp == 'a' || temp == 'b')
{
// body
}
第二个版本稍微快一点
原因:2个方法调用较少(如果不以“a”结尾)。
但两者都不超过
返回变量代码>:
charAt()
只是对数组的访问,并且
- 字符串的
length()
第二个版本稍微快一点
原因:
2个方法调用较少(如果不以“a”结尾)。
但两者都不超过返回变量代码>:
charAt()
只是对数组的访问,并且
- 字符串的
length()
第二个代码是更好的选择,因为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)必须执行两次。第二个代码是更好的选择,因为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)必须执行两次。第二段代码更快,因为.charAt
和.length()
只计算一次。正如其他人指出的那样,可读性显然更为重要,这也有利于第二种解决方案。第二段代码更快,因为.charAt
和.length()
只计算一次。正如其他人指出的,可读性显然更为重要,这也有利于第二种解决方案。这是一个棘手的问题吗?我当然更喜欢第二种结构,因为它更具可读性,而且可能性能更好
编译器可以轻松地优化临时变量,但无法确定函数调用是否有副作用。因此,双函数调用不能优化为一个调用。这是一个关键问题吗?我当然更喜欢第二种结构,因为它更具可读性,而且可能性能更好
编译器可以轻松地优化临时变量,但无法确定函数调用是否有副作用。因此,不能将双函数调用优化为一个调用。这可能是相同的性能,因为优化编译器(或即时编译器/热点)可以在编译时将第1个版本更改为第2个版本。它可能与优化编译器(或即时编译器/热点)的性能相同可以在编译时将第一个版本更改为第二个版本。第二个版本不能再慢了,所以我想我会说第二个版本,因为它至少避免了方法调用。但是,JIT将把它内联起来。除非这是一个非常紧密的循环,否则性能差异几乎可以忽略不计
我个人认为第二个变量更具可读性(如果您调用变量而不是“temp”)。因此,基于这些理由,我会投赞成票。但我认为这是一个更好的问题:哪个更清楚?当您有理由相信这是代码问题时,请担心性能。第二个问题不能再慢了,所以我想我会说第二个问题,因为它至少避免了方法调用。但是,JIT将把它内联起来。除非这是一个非常紧密的循环,否则性能差异几乎可以忽略不计
我个人认为第二个变量更具可读性(如果您调用变量而不是“temp”)。因此,基于这些理由,我会投赞成票。但我认为这是一个更好的问题:哪个更清楚?当您有任何理由相信这是代码问题时,请担心性能。我会选择第二个选项,因为它更易于阅读。另外,str\u final.length()
和str\u final.charAt()
只调用一次
此外,与其调用chartemp
,不如将其称为更有意义的对象,如lastChar
你甚至可以考虑使用一个开关语句,如果你有两个以上的字符来检查:
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;
}
我会选择第二个选项,因为它更容易阅读。另外,str\u final.length()
和str\u final.charAt()
只调用一次
此外,与其调用chartemp
,不如将其称为更有意义的对象,如lastChar
你甚至可以考虑使用一个开关语句,如果你有两个以上的字符来检查:
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;
}
第二个选项速度更快,可读性也更高,但是使用比“temp”更好的名称第二个选项速度更快,可读性也更高,但是使用比“temp”更好的名称第二个版本更好,尽管它的性能比第一个版本小,但它也有两个优点
1.可读性
2.维护——对于这种类型的代码,假设您必须检查更多的条件(比如10),然后更改逻辑,只需一个位置 第二个版本更好,尽管它的性能比第一个版本稍差,但它也有两个优点
1.可读性
2.维护——对于这种类型的代码,假设您必须检查更多的条件(比如10),然后更改逻辑,只需一个位置 真正的问题是哪一个更具可读性?:)谈论可读性。。。那么.endsWith(“a”)
?关心如此微小细节的性能就像用指甲剪修剪草坪。是的,感谢所有。。。我只是在考虑内存,因为我创建了一个临时变量,在一个if中有很多这样或那样的条件。。。现在我认为第二个更好,它值得创建一个变量。。。再次感谢大家……如果您创建一个对象,它的成本将比这样的操作高出10倍以上。我会的