Logback

一个关于记录的常见争论是它的计算代价。这种关心很合理,因为即使是中等大小的应用程序也会生成数以千计的记录请求。人们花了很多精力来测算和调整记录性能。尽管如此,用户还是需要注意下面的性能问题。

  1. 记录被彻底关闭时的记录性能
    你可以将根logger的级别设为最高级的Level.OFF,就可以彻底关闭记录。当记录被彻底关闭时,记录请求的消耗包括一次方法调用和一次整数比较。在CPU为3.2Ghz的Pentium D电脑上,一般需要20纳秒。
    但是,任何方法调用都会涉及“隐藏的” 参数构造消耗,例如,对于logger x,x.debug("Entry number: " + i + "is " + entry[i]);把整数 i 和entry[i]都转换为字符串和连接各字符串会造成消息参数构造消耗,不管消息是否被记录。

参数构造消耗可以变得非常高,同时也跟参数大小有关。利用SLF4J的参数化记录可以避免这种消耗。x.debug("Entry number: {} is {}", i, entry[i]);这种方式不会造成参数构造消耗。与前面的debug()方法相比,这种方法快得多。只有当请求在被发送给appender时,消息才会被格式化。在格式化的时候,负责格式化消息的组件性能很高,不会对整个过程造成负面影响。格式化1个和3个参数分别需要2和4微妙。

请注意,无论如何,应当避免在紧密循环里或者非常频繁地调用记录语句,因为很可能降低性能。即使记录被禁用,在紧密循环里作记录仍然会拖慢应用程序,如果记录被启用,就会产生大量(也是无用的)输出。

  1. 当记录启用时,判断是否进行记录的性能
    在logback中,logger在被创建时就明确地知道其有效级别(已经考虑了级别继承)。当父logger的级别改变时,所有子logger都会得知这个改变。因此,在根据有效级别去接受或拒绝请求之前,logger能够作出准即时判断,不需要咨询其祖先。

  2. 实际记录(格式化和写入输出设备)
    性能消耗包括格式化肌瘤输出和发送到目的地。我们努力使layout(formatter)和appender都尽可能地快。记录到本地机器的文件里的耗时一般大约在9至12微秒。如果目的地是远程服务器上的数据库时,会增加几个毫秒。
    尽管功能丰富,logback最首要的一项设计目标就是执行速度,重要程度仅排在可靠性之后。为提高性能,logback的一些组件已经被多次重写。

REF:[url]http://cwiki.ossez.com/pages/viewpage.action?pageId=4719684[/url]