gpt4 book ai didi

java - Log4j 中的字符串连接性能

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:52:54 25 4
gpt4 key购买 nike

我经常听到人们说,避免 String Concatenation 并在记录时使用 {} 是最佳做法之一。

我正在研究 Log4j 代码以了解他们是如何处理这个问题的,并认为他们正在做类似的事情。

这是 format() 方法的一个片段,它采用模式和参数并返回要记录的消息。

/**
* Formats arguments using SLF4J-like formatter.
* @param pattern pattern, may be malformed.
* @param arguments arguments.
* @return Message string
*/
private static String format(final String pattern,
final Object[] arguments) {
if (pattern != null) {
String retval = "";
int count = 0;
int prev = 0;
int pos = pattern.indexOf("{");
while(pos >= 0) {
if (pos == 0 || pattern.charAt(pos-1) != '\\') {
retval += pattern.substring(prev, pos);
if (pos + 1 < pattern.length() && pattern.charAt(pos+1) == '}') {
if(arguments != null && count < arguments.length) {
retval += arguments[count++];
} else {
retval += "{}";
}
prev = pos + 2;
} else {
retval += "{";
prev = pos + 1;
}
} else {
retval += pattern.substring(prev, pos - 1) + "{";
prev = pos + 1;
}
pos = pattern.indexOf("{", prev);
}
return retval + pattern.substring(prev);
}
return null;
}

我无法理解此实现比使用串联有何优势。对此的任何见解都将非常有帮助。

最佳答案

日志系统中格式字符串的好处是,日志系统可以决定是否必须进行字符串连接。

让我们以这些行为例:

log.debug("Count: " + list.size());
log.debug("Count: {}", list.size());

只要此记录器的级别为调试或更低,性能上就没有差异,但如果日志级别高于调试,则第二行根本不会执行串联。

关于java - Log4j 中的字符串连接性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50144216/

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