final变量对效率的影响实验(java)

本文通过新手实验,对比了在Java方法中使用final修饰变量与不修饰的执行效率,发现final并未显著影响性能,得出结论:final对效率影响微乎其微。实验细节包括设置双层循环测试,排除编译优化因素。
摘要由CSDN通过智能技术生成

final变量对效率的影响实验

、前言:
1.本实验用的环境是java
2.据说java程序的运行时间受jvm的影响,所以实验肯定存在误差。
3.新手的实验

1.实验目的

因为静态检查代码工具要求在变量上添加final来修饰,于是想要研究加fianl对于效率有无影响。

2.实验工具

1.环境jdk 1.8
2.工具 idea

实验方法

1.设置两个相同的方法,其中一个的变量用final修饰,一个不用final修饰。
2.为保证方法的执行时间足够长,选择了平时经常用的map.put和循环
两个方法如下:

//带final
    private static void withFinalFunction(final String name){
        final Boolean flag;
        final int number = 100;
        final Map<String,Object> map = new HashMap<>();
        if(Objects.isNull(name)){
            flag = false;
        }else {
            flag = true;
        }
        for(int i = 0; i < 100; i++){
            if(flag){
                map.put(String.valueOf(i+number),name);
            }
        }

    }
// 不带final
    private static void nofinalFunction(String name){
        Boolean flag;
        int number = 100;
        Map<String,Object> map = new HashMap<>();
        if(Objects.isNull(name)){
            flag = false;
        }else {
            flag = true;
        }
        for(int i = 0; i < 100; i++){
            if(flag){
                map.put(String.valueOf(i+number),name);
            }
        }
    }
//主函数
    public  static  void main(String[] args){
        long start;
//带final
        start = System.currentTimeMillis();
        for(int i = 0;i < 100; i++){
            withFinalFunction("111");
        }
        System.out.println("调用带final修饰的方法执行时间为:" + (System.currentTimeMillis() - start) + "毫秒时间");
// 不带final
        start = System.currentTimeMillis();
        for(int i = 0;i < 100; i++){
            nofinalFunction("111");
        }
        System.out.println("调用不带final修饰的方法执行时间为:" + (System.currentTimeMillis() - start) + "毫秒时间");


    }

实验结果:

第一次结果:(no final 先执行)

no finalfinal
2320
63
52

第二次结果:(final先执行)

finalno final
43
62

说明:这说明不了什么,时间完全取决于顺序问题,因为先执行的是第一次编译,后面执行相同的代码会被优化。
于是我们把倍数放大,用双层循环100*1000000的,然后把带和不带的交叉执行

    public  static  void main(String[] args){
        long start;
        //带final
        start = System.currentTimeMillis();
        for(int i = 0; i < 100; i++){
            withFinalFunction("111");
        }
        System.out.println("调用带final修饰的方法执行时间为:" + (System.currentTimeMillis() - start) + "毫秒时间");
// 不带final
        start = System.currentTimeMillis();
        for(int i = 0; i < 100; i++){
            nofinalFunction("111");
        }
        System.out.println("调用不带final修饰的方法执行时间为:" + (System.currentTimeMillis() - start) + "毫秒时间");

//带final
        start = System.currentTimeMillis();
        for(int i = 0; i < 100; i++){
            withFinalFunction("111");
        }
        System.out.println("调用带final修饰的方法执行时间为:" + (System.currentTimeMillis() - start) + "毫秒时间");
// 不带final
        start = System.currentTimeMillis();
        for(int i = 0; i < 100; i++){
            nofinalFunction("111");
        }
        System.out.println("调用不带final修饰的方法执行时间为:" + (System.currentTimeMillis() - start) + "毫秒时间");
   private static void withFinalFunction(final String name1){
        final Boolean flag1;
        final int number1 = 100;
        final Map<String,Object> map1 = new HashMap<>();
        if(Objects.isNull(name1)){
            flag1 = false;
        }else {
            flag1 = true;
        }
        for(int i = 0; i < 1000000; i++){
            if(flag1){
                map1.put(String.valueOf(i+number1),name1);
            }
        }

    }

结果为:
在这里插入图片描述

结论:

待变量带final和不带final在效率问题上没有影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值