slf4j's advantage是通过提供{}来避免字符串连接的开销。
为什么不能通过重载现有的System.out.println()方法来完成此操作?
最佳答案
您提到的性能优势只有在之后实际上忽略了将要创建的消息并且该消息被丢弃而不使用时才存在。
只要实际使用该字符串(例如记录或打印),使用格式字符串就没有性能优势。
因此,当日志消息的级别低于记录器中设置的当前日志级别时,此优点仅对日志记录方法存在。在这种情况下,如果使用格式字符串并分别传递参数,则可以完全避免字符串连接。这是一种常见情况,因为大多数日志消息通常具有较低的级别,并且在大多数情况下,实际日志级别都设置为较高的级别。因此,在性能至关重要的生产环境中,大多数日志消息都可以忽略,无需创建其完整字符串。
对于System.out.println()
,不存在此优势,因为标准输出始终处于活动状态。每次调用它都会导致创建和打印消息的字符串。没有System.out.println()
的日志级别,可以将其设置为更高的值来忽略对此消息的某些调用。
因此,始终必须完成字符串连接,并且是通过调用代码还是通过方法本身完成字符串连接都是无关紧要的。
此外,如奥利弗(Oliver)所述,System.out.printf()
存在类似的方法,只是syntax of the format string是不同的。