[英]Groovy StringBuilder append GString performance issue
我遇到log4j2
日志記錄問題。
(groovy-all 4.0.0, org.apache.logging.log4j 2.17.1, gmavenplus-plugin 1.13.0)
我有一個很大的嵌套 Map object(10 個鍵和一個值是一個 100 長的地圖列表)。
我稱日志為:
Map myNestedMap = (1..1500).collectEntries{ ["key-$it", "value-$it"] }
log.debug("Some message, $myNestedMap")
這條線工作了10 秒以上......
在調試時我發現這調用了:
//org.apache.logging.log4j.message.ReusableSimpleMessage
@Override
public void formatTo(final StringBuilder buffer) {
buffer.append(charSequence);
}
其中charSequence
是GString
實例。
我添加了一些代碼來檢查性能:
Map myNestedMap = ...
Closure measure = { String message, Closure cl ->
long start = Calendar.getInstance().getTimeInMillis()
cl.call()
long end = Calendar.getInstance().getTimeInMillis()
println("$message ${(end-start)/1000} sec")
}
measure('StringBuilder:(GString, but no cast)') {
new StringBuilder().append("$myNestedMap")
}
measure('StringBuilder:(cast to String)') {
new StringBuilder().append((String)"$myNestedMap")
}
measure('StringBuilder:(cast to CharSequence)') {
new StringBuilder().append((CharSequence)"$myNestedMap")
}
measure('StringBuilder:(cast to GString)') {
new StringBuilder().append((GString)"$myNestedMap")
}
Output:
StringBuilder:(GString, but no cast) 0.354 sec
StringBuilder:(cast to String) 0.296 sec
StringBuilder:(cast to CharSequence) 13.479 sec
StringBuilder:(cast to GString) 12.937 sec
所以我想就如何處理這個問題尋求一些建議。
我可以:
Map myNestedMap = ...
log.debug("Some message, $myNestedMap" as String)
但是我不想在整個項目中將所有日志記錄都轉換為 String。
您可以擴展記錄器並覆蓋調試和其他記錄方法。
或使用元類重新定義GString
的方法
在項目初始化時做一次:
Logger.metaClass.debug = {GString s-> delegate.debug(s as String) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.