[英]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 會處理所有這些。
另一方面,在第二種方法中,您有:
話雖如此,這兩種情況下最“重”的部分是對System.out.println
的塊 IO 調用:)
字符串連接和多次分配在非常頻繁使用時也可能是性能消耗(業務方法在高負載下)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.