簡體   English   中英

管理字符串的有效方法

[英]Efficient way to manage strings

我想打印出我的應用程序的工作流程。 我想知道哪種方式更有效或更好地做事? 這是我的代碼:

private void methodOne {
    System.out.println("Dummy.class -> methodOne() started");
    ...
    System.out.println("Dummy.class -> methodOne() ended");
}

private void methodTwo {
    System.out.println(logMsg("Dummy", "methodTwo") + "started");
    ...
    System.out.println(logMsg("Dummy", "methodTwo") + "ended");
}

private String logMsg(String className, String methodName) {
    return className + ".class -> " + methodName + "() ";
}

我應該使用哪一種? 是像在 methodOne() 中那樣創建整個字符串還是像在 methodTwo() 中那樣重用其中的一部分更好?

編輯:假設我想在至少 100 種方法中使用 logMsg

有很多方法可以實現這一點。

1) AspectJ 將是一個解決方案,如果您不希望您的代碼與 Logging 代碼混淆。

2)另一個想法是編寫一個帶有方法的專用類,您可以在方法的開始和結束時調用該類。 此類可以使用您選擇的日志記錄框架緩沖消息或直接寫入消息。

3) 或者你使用一個特殊的類辭職並直接調用記錄器。

對於第一次嘗試,我可能會從選項 2 開始,因為它比直接在代碼的每個方法中記錄並且每次都必須像if (LOG.isTraceEnabled() {...}這樣的調用更if (LOG.isTraceEnabled() {...}似乎if (LOG.isTraceEnabled() {...}矯枉過正第一次拍攝。

我將省略諸如“使用 AOP”或“使用專用記錄器”之類的明顯答案,並將向您展示“自制”解決方案的想法。

我認為您應該考慮將其拆分為更高級的方法並使用StringBuilder來節省內存:

private String getLogMessage(String className, String methodName, String suffix) {
    return (new StringBuilder()).append(className)
                                .append(".class -> ")
                                .append(methodName)
                                .append("() ")
                                .append(suffix)
                                .toString();
}

private void logStart(String className, String methodName) {
    System.out.println(getLogMessage(className, methodName, "started"));
}

private void logEnd(String className, String methodName) {
    System.out.println(getLogMessage(className, methodName, "ended"));
}



private void method() {
    logStart("Dummy", "methodTwo");
    ...
    logEnd("Dummy", "methodTwo");
}

那么直接回答你的問題:第一種方法顯然更快。

您有一個常量字符串,稍后將分配和重用。 編譯器/JVM 會處理所有這些。

另一方面,在第二種方法中,您有:

  1. 方法調用
  2. 方法內部的字符串連接
  3. 方法外的字符串連接

話雖如此,這兩種情況下最“重”的部分是對System.out.println的塊 IO 調用:)

字符串連接和多次分配在非常頻繁使用時也可能是性能消耗(業務方法在高負載下)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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