簡體   English   中英

Groovy StringBuilder append GString 性能問題

[英]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);
}

其中charSequenceGString實例。

我添加了一些代碼來檢查性能:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM