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

问题描述 投票:0回答:4

所以,我使用的 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
上调用任何方法都会转到外部数据库,以防万一。

java optimization
4个回答
7
投票

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


3
投票

不,为什么会这样?要么

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

它有返回值这一事实并不重要。如果这是一个因素,那么如果调用者不检查其返回值,任何复杂性的任何函数都将面临被优化的风险。


3
投票

运行时(或编译时,相同)的优化不允许给您提供与未优化任何内容时不同的结果(除了运行时或内存节省之外)。如果这里由于优化而没有抛出异常,那么这绝对是另一种行为,因此将是一个错误。

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


1
投票

不。因为优化无法改变代码的语义

© www.soinside.com 2019 - 2024. All rights reserved.