Java死代码消除......此代码是否有被优化的风险?

时间:2011-02-23 23:45:58

标签: java optimization compiler-construction

所以,我使用的API在某些方面有点不友好。基本上,此API会创建一个可以在以后获取的资源。当我们稍后去取它时,这个资源可能存在也可能不存在。

要获取以前创建的资源,您必须使用结果guid,如下所示:

String resultKey = "12345";
PersistedResult r = mFactory.getPersistedResult(resultKey);

现在,棘手的问题是getPersistedResult在使用无效的guid调用时不会抛出异常... PersistedResult是一个惰性加载器,只有在调用其中一个方法时才会失败(导致对象加载)。

因此,为了尝试确定资源是否有效,我正在执行以下操作:

PersistedResult r = null;

if (!StringUtils.isEmpty(resultKey)) {
    try {
       r = mFactory.getPersistedResult(resultKey);
       r.getResultCount(); // Triggers exception if result key was invalid.    
    } catch (Exception e) {
       // handle exception
    }
 }

我对getResultCount的调用是否有被优化的风险,因为我没有使用该值?

调用PersistedResult上的任何方法都会转到外部数据库,以防万一。

由于

4 个答案:

答案 0 :(得分:6)

编译器不能假设getResultCount()没有副作用 - 因此无法删除调用。

答案 1 :(得分:3)

不,为什么会这样? getResultCount都不会被内联,在这种情况下它是一个黑盒子并且必须执行因为它可以做任何事情,或者它会被内联,在这种情况下编译器可以看到它可能会抛出异常,并将执行该操作。

它具有返回值的事实并不重要。如果这是一个因素,那么任何复杂性的任何函数都有可能在调用者没有检查其返回值时被优化出来。

答案 2 :(得分:3)

在运行时(或编译时,相同)的优化不允许给出与优化任何内容时不同的结果(除了运行时或内存节省)。如果在这里因为优化而没有引发异常,那么这绝对是另一种行为,因此就是一个错误。

(注意,在多线程环境中,当涉及不同线程之间的关系时,这有点放松。)

答案 3 :(得分:1)

没有。因为优化不能改变代码的语义