【发布时间】:2014-07-11 08:51:44
【问题描述】:
我们目前正在为医疗档案开发基于 Scala 和 Akka Cluster 的产品。代码中有很多
if(logger.isDebugEnabled()) {
logger.debug(expensiveFunction())
}
在我们之前使用标准 SQL/JPA、阻塞 I/O 和大量线程的代码中,这种构造或多或少是免费的。然而,在反应式编程时代的今天,CPU 缓存同步以及内存屏障和锁被认为是昂贵的,应该避免使用。 Logback isDebugEnabled() 是否会导致易失性访问,从而导致内存屏障。如果是这样,大量的 logger.isDebugEnabled() 是否会成为潜在的性能杀手?
有一篇关于 CPU 缓存同步和内存屏障主题的优秀博文: http://mechanical-sympathy.blogspot.se/2013/02/cpu-cache-flushing-fallacy.html
【问题讨论】:
-
它比不做检查的替代方法要快得多。作为替代方案,您有什么建议?
-
BTW 它仍然比使用 Scala 或在线程之间传递消息便宜得多。
-
它比使用 scala 的
Int而不是int便宜。 -
感谢 cmets。我同意不稳定的访问仍然比例如便宜得多。在线程之间发布,但如果 isDebugEnabled() 施加了内存屏障,则应该在内部循环中避免它。另一种方法是了解影响并尝试将日志记录更稀疏地放置在循环之外。
-
或者只是缓存循环前的值。我不知道 Scala,但在 Java 中:
boolean isDebugEnabled = logger.isDebugEnabled();...稍后...if(isDebugEnabled) logger.debug(expensiveFunction());
标签: java performance logback volatile memory-barriers