Ben*_*n G 3 java logging conditional-compilation overhead
我已经阅读了一些关于使用Java记录调试消息的各种方法,并且来自C背景我的关注点如下:
这些库声称在禁用日志记录(例如生产环境)的情况下开销最小,但由于log()仍在评估其功能的参数,我担心的是实际情况中的开销实际上根本不可忽略.
例如,log(myobject.toString(), "info message")仍然有一个评估的开销myobject.toString(),即使日志函数本身什么都不做也可能相当大.
有没有人有这个问题的解决方案?
PS:对于那些想知道为什么我提到C背景的人:C允许你使用预处理器宏和编译时指令,这些指令将在编译时完全删除与调试相关的所有代码,包括宏参数(根本不会出现).
编辑:在阅读了第一批答案之后,似乎java显然没有任何可以解决这个问题的东西(想想在每个CPU都很重要的移动环境中在一个大循环中记录数字的余弦).所以我要补充一点,我甚至会选择基于IDE的解决方案.我的最后一招是构建类似"查找所有/替换"宏的东西.我首先想到的是,从面向方面的框架中抓取的东西可能会有所帮助......任何人?
我认为log4j FAQ可以很好地解决这个问题:
对于一些记录器l,写作,
Run Code Online (Sandbox Code Playgroud)l.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));导致构造消息参数的成本,即将整数i和entry [i]转换为String,并连接中间字符串.这,无论是否记录消息.
如果你担心速度,那就写吧
Run Code Online (Sandbox Code Playgroud)if(l.isDebugEnabled()) { l.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); }这样,如果对logger l禁用调试,则不会产生参数构造的成本.另一方面,如果记录器启用了调试,则会产生评估记录器是否启用的成本,两次:一次在debugEnabled中,一次在调试中.这是一个微不足道的开销,因为评估记录器所花费的时间不到实际记录语句所需时间的1%.
使用保护子句是避免字符串构造的一般方法.
其他流行的框架,例如slf4j,采用使用格式化字符串/参数化消息的方法,以便除非需要,否则不会对消息进行评估.
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |