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 ..."。技术上不需要这样做。