2012-03-23 79 views
0

我有代码,所有的地方(大概20-30实例)做到这一点:Java表达式优化

<widget>.setVisible((condition == VIEW) || (condition == EDIT)); 

按道理我也明白,Java编译器应该而且可能会优化这个计算起来前并简单地使用计算的布尔值。

我的问题是有什么办法来真正证实这种情况?

澄清

conditionprivate类成员没有办法改变它过去的建设。

+0

我不会依赖编译器来优化它。虽然这是可能的,但它非常复杂,仅在某些情况下有用:如果'condition'是一种方法局部变量几乎可能并且可能完成。如果不是,那取决于“条件”的可变性(通过setVisible sideeffects,其他线程等)。 – dronus 2012-03-23 15:26:25

+2

@卡尔森:我认为你不知道什么样的超重炮会在(可见)部件改变其状态并因此需要变得可见或隐藏时在罩下进行。如果你认为你需要优化这个检查,因为你可能最终会经常打电话给你,你会遇到很大的麻烦,因为这绝对不会降低你的应用的速度...... – TacticalCoder 2012-03-23 15:29:05

+0

另外你的例子似乎相当可疑,术语小部件和'setVisible'让我假设有一个代价高昂的GUI操作或类似的东西,这会使优化的布尔表达式的效果不可见,这是由于这种表达式对常规GUI框架代码的执行限制的巨大差异。 – dronus 2012-03-23 15:30:48

回答

1

拆分类文件为javap,例如,

javap -c com.example.ClassName 

查看字节码的来源。但是,为什么不通过提取一个临时布尔变量来保证优化呢?

0

反汇编字节码。

也就是说,这些类型的优化可能在运行时完成,可能取决于condition的声明,取决于条件所在的位置等等。追踪像这样的优化在所有最简单的用例中都不是微不足道的。

1

有没有什么办法可以真正验证这种情况?

你可以尝试通过看字节码拆卸,以验证这一点,那么在通过热点产生的机器代码等

不过,我认为这个策略是充满了困难。这也是脆弱的,因为结果取决于编译器/ JVM和对condition的确切性质(是本地?类成员?finalvolatile?)

如果你关心的优化性能的原因[1 ],我的建议是通过分解通用表达式来手动执行它。

[1]我假设你已经对代码进行了剖析,并且知道这是一个瓶颈。

+0

是的,它不是其中之一。 – Karlson 2012-03-23 15:56:39