java 优化器是否消除了除非抛出异常才使用其结果的代码
Does the java optimizer eliminate code whose result is not used unless an exception is thrown
考虑以下代码 (java 8):
try
{
// try to create an instance of CardExpirationDate
AfCardExpirationDate.getInstance( anExpMonth, anExpYear);
return true; // expiration date is valid
}
catch ( IllegalArgumentException e )
{
// invalid expiration date
return false;
}
调用 AfCardExpirationDate.getInstance
的结果从未使用过。我们只在此处检查它是否抛出 IllegalArgumentException
。
这里安全吗?或者编译时或运行时代码优化器可以去掉这样的调用吗?
编译器无法优化它。简单明了。
编译器不知道对 getInstance()
的毫无疑问的调用是否没有副作用。除此之外,编译器 显然 确实注意到您的方法有两个 return 路径,因此 try/catch 很重要。
除此之外,作为一名 Java 程序员,您 不会 关心 java 源代码和 class 文件之间发生的优化步骤字节码。
运行时的JIT有profiling信息,当它发现某个方法被频繁调用以至于值得优化时,它会在运行时将它编译成机器码。做具有上下文配置文件知识的编译器可能做的所有事情。
最后:您将 try/catch 误用于 验证 目的。这只是不好的做法(例如,因为相关的运行时性能成本)。当您非常重视 A) 代码质量和 B) 运行时性能时,只需允许进行完整的验证,而不依赖于某些代码的抛出。
考虑以下代码 (java 8):
try
{
// try to create an instance of CardExpirationDate
AfCardExpirationDate.getInstance( anExpMonth, anExpYear);
return true; // expiration date is valid
}
catch ( IllegalArgumentException e )
{
// invalid expiration date
return false;
}
调用 AfCardExpirationDate.getInstance
的结果从未使用过。我们只在此处检查它是否抛出 IllegalArgumentException
。
这里安全吗?或者编译时或运行时代码优化器可以去掉这样的调用吗?
编译器无法优化它。简单明了。
编译器不知道对 getInstance()
的毫无疑问的调用是否没有副作用。除此之外,编译器 显然 确实注意到您的方法有两个 return 路径,因此 try/catch 很重要。
除此之外,作为一名 Java 程序员,您 不会 关心 java 源代码和 class 文件之间发生的优化步骤字节码。
运行时的JIT有profiling信息,当它发现某个方法被频繁调用以至于值得优化时,它会在运行时将它编译成机器码。做具有上下文配置文件知识的编译器可能做的所有事情。
最后:您将 try/catch 误用于 验证 目的。这只是不好的做法(例如,因为相关的运行时性能成本)。当您非常重视 A) 代码质量和 B) 运行时性能时,只需允许进行完整的验证,而不依赖于某些代码的抛出。