public class LogTest {
public static void main(String[] args) {
Integer loop = 100000;
Integer timeScale = 1000*1000;
long time = System.nanoTime();
for(int i=0;i
String s = "hello "+ i +"word";
int size = s.length();
}
time = System.nanoTime() - time;
System.out.println("加号拼接: "+time+"ns"+"\t"+time/timeScale+"ms");
time = System.nanoTime();
for(int i=0;i
StringBuilder s = new StringBuilder();
s.append("hello ").append(i).append("word");
int size = s.length();
}
time = System.nanoTime() - time;
System.out.println("使用Builer:"+time+"ns"+"\t"+time/timeScale+"ms");
time = System.nanoTime();
for(int i=0;i
String s = String.format("%s %d %s","hello",i,"word");
int size = s.length();
}
time = System.nanoTime() - time;
System.out.println("使用format:"+time+"ns"+"\t"+time/timeScale+"ms");
}
}
#loop = 10000
加号拼接: 3236400ns3ms
使用Builer:1463300ns1ms
使用format:63009400ns63ms
#loop = 100000
加号拼接: 15908500ns15ms
使用Builer:6040400ns6ms
使用format:216235300ns216ms
#loop = 1000000
加号拼接: 47109700ns47ms
使用Builer:30339500ns30ms
使用format:1083753400ns1083ms
可以看到随着次数越来越大,format效率越来越低。
我们在打log日志的时候,如果对性能要求很高,在打日志的时候加上isInfoEnabled()的判断,如下如所示:
if (logger.isInfoEnabled()) {
logger.info("pay refund, uid:" + payLog.getUid()+", tradeId:"+payLog.getTradeId()+", updateSucc:" + updateSucc);
}
可以显著的提升性能,isInfoEnabled()的判断当前日志级别是否是info或者以上的级别,如果不加这个判断,不管当前日志是什么级别,都会先去将log.info(msg)中的msg拼接好之后采取判断能不能打印。