문자열 연결 대신 {}를 사용하여 형식화하는 Logger slf4j 장점
{}
문자열 연결 대신 사용하는 이점이 있습니까?
slf4j의 예
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
대신에
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
구성 파일에 따라 런타임에서 매개 변수 평가 (및 문자열 연결)를 피할 수 있기 때문에 속도 최적화에 관한 것이라고 생각합니다. 그러나 두 개의 매개 변수 만 가능하며 때로는 문자열 연결 외에 다른 선택이 없습니다. 이 문제에 대한 견해가 필요합니다.
그것은 이다 문자열 연결 성능에 대해. 밀도가 높은 로깅 문이있는 경우 잠재적으로 중요합니다.
(SLF4J 1.7 이전) 그러나 두 개의 매개 변수 만 가능합니다.
대부분의 로깅 명령문에는 2 개 이하의 매개 변수가 있으므로 버전 1.6까지의 SLF4J API는 대부분의 사용 사례 만 다룹니다. API 디자이너는 API 버전 1.7부터 varargs 매개 변수가있는 오버로드 된 메서드를 제공했습니다.
2 개 이상이 필요하고 1.7 이전 SLF4J로 고착 된 경우에는 문자열 연결 또는 new Object[] { param1, param2, param3, ... }
. 성능이 그다지 중요하지 않을만큼 충분히 적어야합니다.
짧은 버전 : 예, 더 적은 코드로 더 빠릅니다!
문자열 연결은 필요한지 여부를 알지 못해도 많은 작업을 수행하며 (log4j에서 알려진 기존의 "디버깅이 활성화 됨"테스트) 가능하면 피해야합니다. {}는 toString () 호출 및 문자열 생성을 지연시킬 수 있기 때문입니다. 이벤트 캡처가 필요한지 여부가 결정된 후 로거 형식을 단일 문자열로 지정하면 코드가 제 생각에 더 깨끗해집니다.
여러 인수를 제공 할 수 있습니다. 이전 버전의 sljf4j를 사용하고에 인수가 두 개 이상 있는 경우 대신 구문을 {}
사용하여 new Object[]{a,b,c,d}
배열을 전달 해야합니다 . 예를 들어 http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object [])를 참조하십시오 .
속도와 관련하여 : Ceki는 목록 중 하나에 벤치 마크를 게시했습니다.
Java 에서는 문자열이 변경 불가능 하므로 모든 연결 쌍에 대해 왼쪽 및 오른쪽 문자열을 새 문자열로 복사해야합니다. 따라서 자리 표시자를 선택하는 것이 좋습니다.
또 다른 대안은 String.format()
. 우리는 그것을 사용하는 jcabi 로그 (SLF4J 주위에 정적 유틸리티 래퍼).
Logger.debug(this, "some variable = %s", value);
훨씬 더 유지 관리 및 확장 가능합니다. 게다가 번역하기도 쉽습니다.
저자의 관점에서 볼 때 주된 이유는 문자열 연결에 대한 오버 헤드를 줄이는 것이라고 생각합니다. 로거의 문서를 읽었을 때 다음 단어를 찾을 수 있습니다.
/**
* <p>This form avoids superfluous string concatenation when the logger
* is disabled for the DEBUG level. However, this variant incurs the hidden
* (and relatively small) cost of creating an <code>Object[]</code> before
invoking the method,
* even if this logger is disabled for DEBUG. The variants taking
* {@link #debug(String, Object) one} and {@link #debug(String, Object, Object) two}
* arguments exist solely in order to avoid this hidden cost.</p>
*/
*
* @param format the format string
* @param arguments a list of 3 or more arguments
*/
public void debug(String format, Object... arguments);
'Development Tip' 카테고리의 다른 글
async / await는 암시 적으로 promise를 반환합니까? (0) | 2020.10.05 |
---|---|
엄격한 표준 : 변수 만 참조로 전달해야합니다. (0) | 2020.10.05 |
FTL 파일이란? (0) | 2020.10.05 |
JMS 대신 Scala의 액터를 선호하는 디자인 결정은 무엇입니까? (0) | 2020.10.05 |
클라이언트 측의 JavaScript require () (0) | 2020.10.05 |