java 三元运算符 效率,关于java:哪个“如果”构造更快-语句还是三元运算符?...

在Java中,if语句有两种类型-经典:if {} else {}和简写:exp ? value1 : value2。 一个比另一个快还是相同?

声明:

int x;

if (expression) {

x = 1;

} else {

x = 2;

}

三元运算符:

int x = (expression) ? 1 : 2;

我想绝对没有区别。它只是语法。除非编译器有些邪恶(或其他)并且我是错的

你(微)基准了吗?分享结果。

两者都会被激怒。完全没有区别。并且不要打扰反编译的东西。 HotSpot要做的第一件事是进行javac应用的所有优化。

比较低级字节码更好。

关于字节码,您唯一可以说的是它是否相同。

id建议int x=1; if (!expression) x++;-否,甚至更好,请停止微优化。

它们不以不同的速度存在。它们出于不同的目的而存在。我确定您了解语句和表达式之间的区别。语句执行操作。表达式产生值。 if用于语句中。 ?用于表达式中。

@schnaader每个人都知道++ x;比x ++快:P此外,该代码实际上要慢一些(当表达式为假时)2写,有条件跳转和读-与原始代码中有条件跳转,写和读的情况相比不断跳跃

+1是对这个问题的回答,即使原始问题的意图有误,也值得一读。

@詹姆斯:你是对的。因此,我们吸取了教训:停止微优化:)它不会改变任何东西,甚至不会使事情变得更糟。

@finnw-反对者可能来自对微优化问题感到厌倦的开发人员。从本质上讲,它们只不过是对那些在现实世界中没有真正价值的事物进行思索。

如果您正在阅读本文,请不要错过詹姆斯的评论

那里只有一种" if"语句。另一个是条件表达式。至于哪种性能更好:它们可以编译为相同的字节码,并且我希望它们的行为相同-或如此接近以至于您绝对不希望在性能方面选择一个。

有时if语句将更具可读性,有时条件运算符将更具可读性。特别是,当两个操作数简单且无副作用时,我建议使用条件运算符,而如果两个分支的主要目的是它们的副作用,则可能会使用if语句。

这是一个示例程序和字节码:

public class Test {

public static void main(String[] args) {

int x;

if (args.length > 0) {

x = 1;

} else {

x = 2;

}

}

public static void main2(String[] args) {

int x = (args.length > 0) ? 1 : 2;

}

}

用javap -c Test反编译的字节码:

public class Test extends java.lang.Object {

public Test();

Code:

0: aload_0

1: invokespecial #1

4: return

public static void main(java.lang.String[]

Code:

0: aload_0

1: arraylength

2: ifle          10

5: iconst_1

6: istore_1

7: goto          12

10: iconst_2

11: istore_1

12: return

public static void main2(java.lang.String[

Code:

0: aload_0

1: arraylength

2: ifle          9

5: iconst_1

6: goto          10

9: iconst_2

10: istore_1

11: return

}

如您所见,这里的字节码略有不同-istore_1是否出现在brance中(与我以前的严重缺陷尝试不同:),但是如果JITter以不同的本机代码结束,我将感到非常惊讶。

s /条件语句/条件表达式/

@劳伦斯:嗯-谢谢,固定。

我猜你不是说main和main2完全一样吗?

@ColinD:糟糕:)编辑中...

令人印象深刻。我直到现在才知道您可以编译字节码。

@Kyle:我编译了Java,然后用javap进行了反编译。

哦...您将其反编译以查看其编译结果,以确定哪种样式效果最佳?

@Kyle:是的。 id最希望字节码是相同的。实际上,它几乎是完全相同的:)

令人印象深刻的答案:)

您的两个示例都可能会编译为相同或几乎相同的字节码,因此性能应该没有差异。

如果执行速度有所不同,则仍应使用最惯用的版本(第二个版本用于基于简单条件和两个简单??的子表达式分配单个变量,第一个版本用于执行更复杂的操作或单行不适合的操作)。

这些都是一样的。两者都相当快,通常约为10到30纳秒。 (取决于使用模式)这个时间范围对您来说重要吗?

您应该做自己认为最清楚的事情。

只是添加到所有其他答案:

第二个表达式通常称为三级/三级运算符/语句。它会返回一个表达式,因此非常有用。有时,它会使典型的简短语句的代码更加清晰。

在实践中这是一个很好的例子:在Java中,如果我必须基于表达式的结果使String结尾,那么我可以使用三元语法final String whichTable =(Integer.parseInt(clientId)> 500)?" serverClients":" offlineClients";然后,我可以在whichTable需要为最终值的地方使用表达式的值。以下内容将是非法的:最终字符串whichTable ="; if(Integer.parseInt(clientId)> 500){whichTable =" serverClients";} else {whichTable =" offlineClients";}

@JamesPerih确实如此。

@JamesPerih在final字段的情况下,可以使用构造函数块来设置值(尽管条件运算符看起来比IMO好十亿倍),并且可以使用局部变量来分配值,然后在以后的第一次使用之前代码阻止您进入。我认为三元组比if-else更具优势的唯一情况是在构造函数中调用super(...)或this(...)时。

都不-它们将被编译为相同的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值