java final修饰符效率测试

本文通过测试验证了Java中final关键字对静态工具类、日志初始化和非静态类的性能影响。测试结果显示,在特定环境下,final修饰的静态工具类和非静态类在效率上有所提升,而日志初始化时final修饰并未带来明显优势。结论建议在多线程频繁初始化的场景下使用final修饰类。
摘要由CSDN通过智能技术生成

说明

本博客每周五更新一次。
java语言final修饰符,可以修饰变量、方法和类,传言可以提升执行效率,实际情况到底如传言一样,写个程序测一下,一切自见分晓。

分享

测试

  • 测试分为三个方面,static工具类final修饰、日志初始化final修饰、非static类final修饰。

环境

  • 电脑:联想拯救者R700 2020款
  • cpu:AMD 4800H
  • jdk 1.8.0_181

static工具类final修饰

  • 先创建两个static工具类,一个final修饰,一个正常。

代码

  • final修饰类
public final class StringUtilFinal {
	
	/**
	 * 判断字符串是否为空
	 */
	public static boolean isEmpty(String str){
		if(str==null||str.equals("")||str.length()<=0){
			return true;
		}
		return false;
	}
	
	/**
	 * 判断字符串是否不为空
	 */
	public static boolean isNotEmpty(String str){
		return !isEmpty(str);
	}
}
  • 正常类
public class StringUtilNoFinal {
	
	/**
	 * 判断字符串是否为空
	 */
	public static boolean isEmpty(String str){
		if(str==null||str.equals("")||str.length()<=0){
			return true;
		}
		return false;
	}
	
	/**
	 * 判断字符串是否不为空
	 */
	public static boolean isNotEmpty(String str){
		return !isEmpty(str);
	}
}
  • 测试方法
public void testFinalClass() {
    int size=1000000;
    
    String data="12312312";
    
    long start=System.currentTimeMillis();
    for(int i=0;i<size;i++) {
        StringUtilNoFinal.isNotEmpty(data);
    }
    System.out.println("No Final Cost Time:"+(System.currentTimeMillis()-start));
    
    start=System.currentTimeMillis();
    for(int i=0;i<size;i++) {
        StringUtilFinal.isNotEmpty(data);
    }
    System.out.println("Final Cost Time:"+(System.currentTimeMillis()-start));
}

结果

  • 经过几次1000000次执行,少数相等4ms,final稳定4ms,no final在4和6之间波动。

日志初始化final修饰

  • 类日志初始化,创建final和非final对象执行,此处日志系统使用sef4j 1.7.26+logbck 1.2.3

代码

  • 创建代码
private Logger log = LoggerFactory.getLogger(this.getClass()); 
private final Logger logFinal = LoggerFactory.getLogger(this.getClass()); 
  • 测试代码
public  void testLog() {
    String data="~~我是日志~~";
    int size=100000;
    long start=System.currentTimeMillis();
    for(int i=0;i<size;i++) {
        log.info(data);
    }
    long value=System.currentTimeMillis()-start;
    
    
    long startLong=System.currentTimeMillis();
    for(int i=0;i<size;i++) {
        logFinal.info(data);
    }
    
    System.out.println("Log No Final Cost Time:"+value);
    System.out.println("Log Final Cost Time:"+(System.currentTimeMillis()-startLong));
}

结果

  • 100000次执行后,No Final执行时间2645ms,Final执行时间2821ms,快差不多200ms

非static类final

  • 创建final修饰和不修饰的数据类,循环创建。

代码

  • 非final类
public class NoFind {
	
	private String name;
	
	private String address;
	
	private String code;
	
	private String msg;

	@Override
	public String toString() {
		return "Find [address=" + address + ", code=" + code + ", msg=" + msg + ", name=" + name + "]";
	}
	
	public void test() {
		System.out.println("1231232");
	}
}
  • final类
public final class Find {
	
	private String name;
	
	private String address;
	
	private String code;
	
	private String msg;

	@Override
	public String toString() {
		return "Find [address=" + address + ", code=" + code + ", msg=" + msg + ", name=" + name + "]";
	}
	
	public void test() {
		System.out.println("1231232");
	}
}
  • 测试方法
public void testClass() {
    int size=1000000;
    
    long start=System.currentTimeMillis();
    Find find;
    for(int i=0;i<size;i++) {
        find=new Find();
        find.toString();
    }
    System.out.println("No Final Cost Time:"+(System.currentTimeMillis()-start));
    
    start=System.currentTimeMillis();
    NoFind noFind;
    for(int i=0;i<size;i++) {
        noFind=new NoFind();
        noFind.toString();
    }
    System.out.println("Final Cost Time:"+(System.currentTimeMillis()-start));
}

结果

  • 运行1000000次,find类执行更快。具体执行时间如下
仅初始化初始化+toString
find3ms30ms
no-find5ms43ms

结论

  • 以上测试是特定环境下的结果,可以作参照。
    • static工具类,final修饰类更好
    • 普通类日志对象,不用final修饰
    • 普通类final后,效率更高,建议多线程频繁初始化的类,使用final修饰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值