Java中利用final关键字inline编译优化真的有效吗?

(inkfish原创,转载请注明出处:http://blog.csdn.net/inkfish/)

  为寻求java代码的性能优化,从网上搜到利用final关键字进行编译时inline优化的方法,但是真的有效吗?实际测试中发现未必,甚至性能影响巨大,最终放弃了使用final优化的想法。

  测试环境:Windows XP SP2,JDK 1.6.0_15-b03,Eclipse 3.5 SR1。

 

package test;
public class Test {
public static void main(String[] args) {
int loop = 10000000;//测试1000万循环
String num = "0";
//----第一遍----
{
System.out.print("第一遍:/t");
long start = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
Class1 c1 = new Class1();
c1.setF1(num);
c1.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
Class2 c2 = new Class2();
c2.setF1(num);
c2.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
Class1 c1 = new Class1();
for (int i = 0; i < loop; i++) {
c1.setF1(num);
c1.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
Class2 c2 = new Class2();
for (int i = 0; i < loop; i++) {
c2.setF1(num);
c2.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
}
//----第二遍----
{
System.out.print("/n第二遍:/t");
long start = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
Class1 c1 = new Class1();
c1.setF1(num);
c1.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
Class2 c2 = new Class2();
c2.setF1(num);
c2.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
Class1 c1 = new Class1();
for (int i = 0; i < loop; i++) {
c1.setF1(num);
c1.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
Class2 c2 = new Class2();
for (int i = 0; i < loop; i++) {
c2.setF1(num);
c2.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
}
//----第三遍----
{
System.out.print("/n第三遍:/t");
long start = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
Class1 c1 = new Class1();
c1.setF1(num);
c1.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < loop; i++) {
Class2 c2 = new Class2();
c2.setF1(num);
c2.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
Class1 c1 = new Class1();
for (int i = 0; i < loop; i++) {
c1.setF1(num);
c1.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
Class2 c2 = new Class2();
for (int i = 0; i < loop; i++) {
c2.setF1(num);
c2.getF1();
}
System.out.printf("%5dms", (System.currentTimeMillis() - start));
}
}
}
class Class1 {
private String f1;
public String getF1() {
return f1;
}
public void setF1(String f1) {
this.f1 = f1;
}
}
final class Class2 {
private String f1;
public final String getF1() {
return f1;
}
public final void setF1(String f1) {
this.f1 = f1;
}
}

运行结果:

第一遍: 110ms 1203ms 16ms 156ms
第二遍: 94ms 1203ms 15ms 141ms
第三遍: 94ms 1203ms 15ms 141ms

 

总结:

1.利用final进行inline优化无效;

2.有时候结果往往出乎多数人预料。

 

 

时间: 2025-01-02 02:36:44

Java中利用final关键字inline编译优化真的有效吗?的相关文章

详解Java中的final关键字的使用_java

final含义 final是Java中的一个保留关键字,可以声明成员变量.方法和类.一旦你将引用声明为final类型,你将不能再改变这个引用了.编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误.final变量 凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫做final变量.下面是final修饰变量的例子: final int constValue = 1; // constValue = 2; The final local va

浅析Java中的final关键字

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一.final关键字的基本用法 在J

浅析Java中的final关键字(转)

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一.final关键字的基本用法 在J

JAVA中的final关键字用法实例详解_java

本文实例讲述了JAVA中的final关键字用法.分享给大家供大家参考,具体如下: 根据上下文环境,java的关键字final也存在着细微的区别,但通常指的是"这是无法改变的."不想改变的理由有两种:一种是效率,另一种是设计.由于两个原因相差很远,所以关键子final可能被误用. 接下来介绍一下使用到final的三中情况:数据,方法,类 final数据 许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的.有时数据的恒定不变是很有用的,例如: 1. 一个编译时恒定不变的常量 2.

深入浅析Java中的final关键字_java

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. final 对于常量来说,意味着值不能改变,例如 final int i=100.这个i的值永远都是100.但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final

转载:浅析Java中的final关键字

谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3736238.html 一.final关键字的基本用法 在J

浅谈Java中的final关键字与C#中的const, readonly关键字_java

在编程语言中都有某种方式,告知编译器一块数据是恒定不变的.有两个需求 1. 一个永不改变的编译器常量 2. 一个在运行时被初始化的值,而这个值不会被改变 在Java中,使用final修饰变量实现这两个需求 <pre name="code" class="java">//编译器常量 private final int valueOne = 9; private static final int VALUE_TWO = 99; public static f

Java中的final关键字详细介绍_java

•final变量如果在变量前加final关键字,则这个变量一旦被初始化,便不可再改变. 如果一个final变量是类成员变量,则必须被初始化,且只能被初始化一次. 方法中的参数也可以是final变量.这在我们需要传递引用型的变量时非常有用,因为有时候我们并不希望调用函数修改该变量而影响到原函数中对象的值.因此将引用型变量设为final类型可以有效方式变量被调用参数修改.此时在调用方法中只可以使用该变量,但不能对其做任何修改. 复制代码 代码如下: void test(final int a){ 

Java中的final

这几天,在网上找了一些关于final的知识,当然并不全面,有的一时也没有很好的理解,先收集起来,理理思路,把不懂的画出来,以便更好地学习-- Java中的final关键字通常的指的是"这是无法改变的".它可能被做为三种的修饰词.------数据(基本类型,对象或者数组),方法(类方法.实例方法),类. <1>final应用于类 如果类被声明为final,则表示类不能被继承,也就是说不能有子类.因为不能有子类,所以final类不能被声明为abstract抽象类.所以final