[optimization] 문자열 연결 대신 {}를 사용하여 형식화하는 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);


답변