【发布时间】:2015-05-01 20:19:00
【问题描述】:
为了跟踪和调试我的Java 代码,我使用的是简单的Util 类而不是成熟的日志框架:
public class Util {
public static int debugLevel;
public static void info(String msg) {
// code for logfile output
// handling of unprintable characters
// etc. omitted
System.out.println(msg);
}
public static void info4(String msg) {
if (debugLevel >= 4) {
info(msg);
}
}
}
这允许像下面这样紧凑的单行语句:
info4(String.format("%16s: ", host) + Util.toHex(sidNetto));
使用debugLevel 变量,我可以控制程序的详细程度。通常,调试级别在执行开始时全局设置。但它也可以在常规水平上进行局部调整。
基本上,我将重复的 if (debugLevel >= DEBUG_ALL) {...} 括号保存在我的跟踪调用周围。但是,无论调试级别如何,都必须在运行时准备和传递调用的参数。
我的问题:
我如何推动编译时优化器或 JVM 删除多余的跟踪调用?我正在考虑
C/C++函数内联的行。
关于C# 的相关问题已在here 进行了讨论。但我不确定如何将建议的答案移植到Java。
另一个来自 2010 年的 related post 讨论了与我类似的方法。我想知道是否真的需要像ProGuard 这样的第三方工具来解决这样一个常见的任务。
【问题讨论】:
-
为什么不使用现有的日志记录 API,例如 SLF4J?
-
如果您使用 java 8,您可以将 lambda 表达式传递给您的
info方法,而不是String。然后你可以在执行代码之前检查调试级别。 -
不确定是否可以告诉 Hotspot 重新评估代码,问题是它是否真的很重要。在 99% 的情况下,您的时间关键型应用无论如何都不会被中间跟踪。
-
@isnot2bad:如果现有的日志框架解决了这个问题,我很想知道他们是如何做到的。到目前为止,日志框架的复杂性让我有点不知所措。
-
不,我不认为任何记录器可以操纵 JIT 统计信息,但是它们中的大多数都使用 Object 参数推广内置格式化程序,这在大多数微不足道的情况下都有帮助。
标签: java performance debugging trace