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 final | final |
---|---|
23 | 20 |
6 | 3 |
5 | 2 |
第二次结果:(final先执行)
final | no final |
---|---|
4 | 3 |
6 | 2 |
说明:这说明不了什么,时间完全取决于顺序问题,因为先执行的是第一次编译,后面执行相同的代码会被优化。
于是我们把倍数放大,用双层循环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在效率问题上没有影响。