性能浪费的日志案例
函數式編程
在兼顧面向對象特性的基礎上,Java語言通過Lambda表達式與方法引用等,為開發者打開了函數式編程的大門。
下面我們做一個初探。
Lambda的延遲執行
有些場景的代碼執行后,結果不一定會被使用,從而造成性能浪費。而Lambda表達式是延遲執行的,這正好可以作為解決方案,提升性能。
性能浪費的日志案例
注:日志可以幫助我們快速的定位問題,記錄程序運行過程中的情況,以便項目的監控和優化。
一種典型的場景就是對參數進行有條件使用,例如對日志消息進行拼接后,在滿足條件的情況下進行打印輸出:
package com.learn.demo02.Lambda; /*日志案例發現以下代碼存在的一些性能浪費的問題調用showLog方法,傳遞的第二個參數是一個拼接后的字符串先把字符串拼接好,然后在調用showLog方法showLog方法中如果傳遞的日志等級不是1級那么就不會是如此拼接后的字符串所以感覺字符串就白拼接了,存在了浪費*/ public class Demo01Logger {//定義一個根據日志的級別,顯示日志信息的方法public static void showLog(int level, String message){//對日志的等級進行判斷,如果是1級別,那么輸出日志信息if(level==1){System.out.println(message);}}public static void main(String[] args) {//定義三個日志信息String msg1 = "Hello";String msg2 = "World";String msg3 = "Java";//調用showLog方法,傳遞日志級別和日志信息showLog(2,msg1+msg2+msg3);} }這段代碼存在問題:無論級別是否滿足要求,作為log 方法的第二個參數,三個字符串一定會首先被拼接并傳入方法內,然后才會進行級別判斷。如果級別不符合要求,那么字符串的拼接操作就白做了,存在性能浪費。
備注:SLF4J是應用非常廣泛的日志框架,它在記錄日志時為了解決這種性能浪費的問題,并不推薦首先進行字符串的拼接,而是將字符串的若干部分作為可變參數傳入方法中,僅在日志級別滿足要求的情況下才會進行字符串拼接。例如: LOGGER.debug("變量{}的取值為{}。", "os", "macOS") ,其中的大括號{} 為占位符。如果滿足日志級別要求,則會將“os”和“macOS”兩個字符串依次拼接到大括號的位置;否則不會進行字符串拼接。這也是一種可行解決方案,但Lambda可以做到更好。
總結
- 上一篇: 函数式接口的使用
- 下一篇: 使用Lambda优化日志案例