slf4j's advantage은 {}을 제공하여 문자열 연결의 오버 헤드를 방지한다는 것입니다. 왜 기존 System.out.println() 메소드로 오버로드하여이 작업을 수행 할 수 없습니까?문자열 연결이 성능 오버 헤드 인 경우 System.out.println()이 아직 오버로드되지 않은 이유는 무엇입니까?
답변
작성한 메시지가 실제로 무시되고 메시지가 사용되지 않고 폐기 된 경우에만 언급되는 성능 이점이 있습니다. 문자열을 실제로 사용 (예 : 기록 또는 인쇄) 할 때마다 형식 문자열을 사용하면 성능상의 이점이 없습니다.
따라서이 이점은 로그 메시지의 수준이 로거에 설정된 현재 로그 수준보다 낮은 경우 로깅 방법에만 존재합니다. 이 경우 형식 문자열을 사용하고 인수를 개별적으로 전달하는 경우 문자열 연결을 완전히 피할 수 있습니다. 일반적으로 대부분의 로그 메시지는 일반적으로 낮은 수준을 가지며 대부분의 경우 실제 로그 수준이 더 높은 수준으로 설정되기 때문에 이는 일반적인 경우입니다. 따라서 성능이 중요한 프로덕션 환경에서는 대부분의 로그 메시지를 무시하고 전체 문자열을 생성 할 필요가 없습니다.
System.out.println()
의 경우 표준 출력은 항상 활성이기 때문에이 장점은 없습니다. 모든 호출은 작성되고 인쇄되는 메시지에 대한 문자열로 이어집니다. System.out.println()
의 로그 레벨은이 메시지에 대한 일부 호출을 무시하기 위해 높은 값으로 설정할 수 있습니다. 따라서 문자열 연결은 항상 수행되어야하며 호출 코드에 의해 수행되는지 또는 메소드 자체에 의해 수행되는지는 관계가 없습니다.
올리버가 언급 한 것처럼 System.out.printf()
과 유사한 방법이 있으며 syntax of the format string 만 다릅니다.
Wender : "표준 출력은 항상 활성"이라는 의미로 명확히 설명해 주시겠습니까? –
@gansai 답변을 연장했습니다. –
기본적으로'System.out.printf'가 수행하는 것입니다 ... –