gpt4 book ai didi

java - java编译器会优化基于静态变量条件化的静态函数吗?

转载 作者:行者123 更新时间:2023-11-30 08:56:37 25 4
gpt4 key购买 nike

对于 android 应用程序,我正在使用如下所示的日志记录功能 -

public static void logData(String str) {
if (BuildConfig.DEBUG) Log.d("MYTAG", str);
}

这里,BuildConfig.DEBUG 是一个静态变量,在 Debug模式下编译代码时设置为 true,在 Release模式下编译时设置为 false。

我知道如果我直接在代码中的任何地方使用 if(BuildConfig.DEBUG) Log.d("MYTAG", msg);,编译器会在 Release模式下优化并完全去除调用.

我想知道像 logData 这样完全依赖于单个静态变量的函数是否也会得到优化,并且它的调用会被编译器完全删除。还是编译器只会将 logData 设为空函数并保留所有调用?

最佳答案

不,编译器不会删除对您的日志记录方法的调用,尽管内部的 if block 会得到优化。

这被称为日志记录的包装器方法,它最大的缺点是传递的任何参数仍然分配内存,除此之外,您处理的任何 String做,喜欢,

LogHelper.logData("varName is " + varName);

虽然参数从未实际用于日志记录,但仍会创建 StringBuilder,这会导致轻微的性能下降。


优化主要取决于目标 JVM 实现,因为优化大部分代码的不是 javac 编译器,而是将字节码转换为机器码的 JIT 编译器。

那是因为它可以访问运行时统计信息,哪些类正在加载或未加载,甚至知道 javac 不知道的实际目标平台。但是,在日志记录的情况下,由于 BuildConfig.DEBUG 是一个 static final 常量,javac 可以安全地优化 if block 。

要检查编译时优化,您可以使用 javap disassmebler 或任何 Java 反编译器来查看生成的字节代码。对于运行时优化,您可以查看此白皮书 The Java HotSpot Performance Engine Architecture来自 Oracle,尤其是第 3 章 Java HotSpot 编译器

关于java - java编译器会优化基于静态变量条件化的静态函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com