Android 优化 NDK 函数 vs Java 最终布尔值
Android optimization NDK function vs Java final boolean
我有一些日志记录代码应该只适用于内部构建,我的 NDK C++ 中有逻辑来决定这是否是内部构建:
native boolean isInternalBuild();
void log() {
if (isInternalBuild()) {
Log.d("LOG", "Log this: " + someLogicToComputeLog());
}
}
如果我切换到 Java 最终布尔值,Java 编译器或 JIT 是否能够优化它,或者它会执行大致相同的操作:
static final boolean INTERNAL_BUILD = false; // or true in case this is an internal build
void log() {
if (INTERNAL_BUILD) {
Log.d("LOG", "Log this: " + someLogicToComputeLog());
}
}
在第一种情况下优化测试几乎肯定超出了 JIT 编译器的能力。
在第二种情况下,Java 编译器很可能(但不保证 1)在表达式是一个 编译时常量表达式 ,计算结果为 false
。此 "conditional compilation" 功能在 JLS 14.21(本节末尾)中进行了描述。
注意事项是:
- 此功能仅适用于
if
语句,并且
- 它仅在 JLS 15.28.
意义上测试(编译时)常量表达式 时有效
由于此优化通常 由Java 字节码编译器完成,您可以轻松确认它是由您的[=39] 完成的=] 编译器使用 javap
检查字节码。
1 - JLS 文本说:"An optimizing compiler ... may choose to omit the code for that statement from the generated class file ..."。技术上不需要这样做。
我有一些日志记录代码应该只适用于内部构建,我的 NDK C++ 中有逻辑来决定这是否是内部构建:
native boolean isInternalBuild();
void log() {
if (isInternalBuild()) {
Log.d("LOG", "Log this: " + someLogicToComputeLog());
}
}
如果我切换到 Java 最终布尔值,Java 编译器或 JIT 是否能够优化它,或者它会执行大致相同的操作:
static final boolean INTERNAL_BUILD = false; // or true in case this is an internal build
void log() {
if (INTERNAL_BUILD) {
Log.d("LOG", "Log this: " + someLogicToComputeLog());
}
}
在第一种情况下优化测试几乎肯定超出了 JIT 编译器的能力。
在第二种情况下,Java 编译器很可能(但不保证 1)在表达式是一个 编译时常量表达式 ,计算结果为 false
。此 "conditional compilation" 功能在 JLS 14.21(本节末尾)中进行了描述。
注意事项是:
- 此功能仅适用于
if
语句,并且 - 它仅在 JLS 15.28. 意义上测试(编译时)常量表达式 时有效
由于此优化通常 由Java 字节码编译器完成,您可以轻松确认它是由您的[=39] 完成的=] 编译器使用 javap
检查字节码。
1 - JLS 文本说:"An optimizing compiler ... may choose to omit the code for that statement from the generated class file ..."。技术上不需要这样做。