`
cn_arthurs
  • 浏览: 327594 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

临时变量提高Java代码性能

阅读更多

Java程序类中可以存在多种形式的变量,Java类一般有种变量:成员变量、静态变量、临时变量。本文将介绍这三种变量的存取效率。

1、测试

下面作个实验,看下面代码。

class CheckVars {

 

    private int instVar;// 成员变量

 

    private static int staticVar; // 静态变量

 

 

    // 存取类方法中的临时变量

 

    void tempAccess(int val) {

 

       int j = 0;// 临时变量

 

       long startTime = System.currentTimeMillis();

 

       for (int i = 0; i < val; i++)

 

           j += 1;

 

       long endTime = System.currentTimeMillis();

 

       System.out.println("temp var: " + (endTime - startTime) + " milli seconds");

 

    }

 

 

    // 存取类的成员变量

 

    void instanceAccess(int val) {

 

       long startTime = System.currentTimeMillis();

 

       for (int i = 0; i < val; i++)

 

           instVar += 1;

 

       long endTime = System.currentTimeMillis();

 

       System.out.println("instance var: " + (endTime - startTime) + " milli seconds");

 

    }

 

 

    // 存取类的 static 变量

 

    void staticAccess(int val) {

 

       long startTime = System.currentTimeMillis();

 

       for (int i = 0; i < val; i++)

 

           staticVar += 1;

 

       long endTime = System.currentTimeMillis();

 

       System.out.println("static var: " + (endTime - startTime) + " milli seconds");

 

    }

 

   

 

    public static void main(String[] args){

 

       CheckVars test=new CheckVars();

 

       test.tempAccess(200000000);

 

       test.instanceAccess(200000000);

 

       test.staticAccess(200000000);

 

    }

 

}

结果:

temp var: 350 milli seconds iE8itug
instance var: 821 milli secondsiE8itug
static var: 852 milli seconds

 

这段代码中的每个方法都执行相同的循环,并反复相同的次数。唯一的不同是每个循环使一个不同类型的变量递增。方法tempAccess 使一个局部堆栈变量递增,instanceAccess 使类的一个成员实例变量递增,而staticAccess 使类的一个static 变量递增。

从结果中可以发现,instanceAccess 和staticAccess 的执行时间基本相同。但是,tempAccess 要快两到三倍。

2、JVM存取变量机制

存取堆栈变量如此快是因为JVM 存取堆栈变量比它存取static 变量或类的实例变量执行的操作少。JVM 是一种基于堆栈的虚拟机,因此优化了对堆栈数据的存取和处理。所有局部变量都存储在一个局部变量表中,在Java 操作数堆栈中进行处理,并可被高效地存取。

存取static变量和实例变量成本更高,因为JVM 必须使用代价更高的操作码,并从常数存储池中存取它们。(常数存储池保存一个类型所使用的所有类型、字段和方法的符号引用。)通常,在第一次从常数存储池中访问static 变量或实例变量以后,JVM 将动态更改字节码以使用效率更高的操作码。尽管有这种优化,堆栈变量的存取仍然更快。

3、优化代码

考虑到这些事实,就可以重新构建前面的代码,以便通过存取堆栈变量而不是实例变量或static 变量使操作更高效。

public class CheckVarsAdv {

 

    private int instVar;

 

    private static int staticVar;

 

 

    void tempAccess(int val) {

 

       int j = 0;

 

       long startTime = System.currentTimeMillis();

 

       for (int i = 0; i < val; i++)

 

           j += 1;

 

       long endTime = System.currentTimeMillis();

 

       System.out.println("temp var: " + (endTime - startTime) + " milli seconds");

 

    }

 

 

    void instanceAccess(int val) {

 

       int j = instVar;

 

       long startTime = System.currentTimeMillis();

 

       for (int i = 0; i < val; i++)

 

           j += 1;

 

       long endTime = System.currentTimeMillis();

 

       System.out.println("instance var: " + (endTime - startTime) + " milli seconds");

 

       instVar = j;

 

    }

 

 

    void staticAccess(int val) {

 

       int j = staticVar;

 

       long startTime = System.currentTimeMillis();

 

       for (int i = 0; i < val; i++)

 

           j += 1;

 

       long endTime = System.currentTimeMillis();

 

       System.out.println("static var: " + (endTime - startTime) + " milli seconds");

 

       staticVar = j;

 

    }

 

   

 

    public static void main(String[] args){

 

       CheckVarsAdv test=new CheckVarsAdv();

 

       test.tempAccess(200000000);

 

       test.instanceAccess(200000000);

 

       test.staticAccess(200000000);

 

    }

 

}

结果:

temp var: 341 milli secondsiE8itug
instance var: 370 milli secondsiE8itug
static var: 361 milli seconds

方法:instanceAccess和 staticAccess 被修改为将它们的实例变量或static 变量复制到局部堆栈变量中。当变量的处理完成以后,其值又被复制回实例变量或static 变量中。这种简单的更改明显提高了instanceAccess 和staticAccess 的性能。这三个方法的执行时间现在基本相同。

 

转载自:http://www.itug.cn/Procedures/Java/20071113/1757.htm

分享到:
评论
1 楼 elstage 2008-11-26  
倒是有点小意思,不错

相关推荐

    提高Java程序性能

    尽可能将参数和临时变量设计为局部变量,减少对堆的依赖。 6. **包装类型与基本类型的权衡**:包装类型(Integer, Double等)是对象,存在于堆中,而基本类型(int, double等)在栈中处理。根据需求选择合适的类型...

    通过Java代码技巧改善性能

    在本篇文章中,我们将分享一些Java代码技巧,以提高程序性能。这些技巧虽然看起来微不足道,但是可以为系统性能带来成倍的提升。 首先,让我们来讨论try-catch语句的使用。在Java开发中,try-catch语句经常用于错误...

    《kettle中调用java类》示例代码

    这种方式适用于简单或临时性的Java代码,对于复杂的业务逻辑,推荐使用Java Class步骤。 在提供的压缩包文件中,有两个`.ktr`文件,分别是`commons.md5.ktr`和`custom.md5.ktr`。这两个文件是Kettle的转换文件,...

    文档java代码规范

    合理使用局部变量,避免过多的临时变量。 ### Java 5.0特性 Java 5引入了许多新特性,如枚举、泛型、自动装箱/拆箱、可变参数等,编码时应充分利用这些特性,提高代码的类型安全性和可读性。 ### 性能 优化性能时...

    java代码效率优化.docx

    3. 尽量使用局部变量:调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。 Java 中的局部变量保存在栈中,而实例变量和静态变量保存在堆(Heap)中。使用局部变量可以提高性能。 4...

    Linux配置java环境变量(详细)

    环境变量可以指定命令搜索路径、类搜索路径和 JDK 安装目录等,正确地配置环境变量可以提高开发效率和应用性能。 二、配置 JDK 的环境变量 1. PATH 环境变量 PATH 环境变量的作用是指定命令搜索路径,在 shell ...

    Java 代码优化常见注意点

    以下是一些常见的Java代码优化建议: 1. **字符串操作优化** - 对于不会改变的常量字符串,应优先使用`String`而非`StringBuffer`。这是因为`String`对象是不可变的,而`StringBuffer`适用于频繁拼接操作,但会...

    Java基础:减少对象的创建提高java性能

    5. 使用流API:Java 8引入的流API允许链式操作,减少了临时对象的生成,提高了性能。 6. 利用编译器优化:现代的Java编译器(如JIT)会进行一些运行时优化,如逃逸分析,识别出某些对象不会逃逸出当前作用域,从而...

    Java性能优化的45个细节.pdf

    5. 局部变量:临时变量放在栈中,访问速度快;静态变量、实例变量放在堆中,速度较慢。 6. 包装类型与基本类型:基本类型在栈中处理,速度快;包装类型是对象,在堆中创建,速度慢。建议在集合类对象中使用包装类型...

    Java GC与性能调优

    * 栈:用于存放临时变量、参数和中间结果。 * 本地方法栈:用于支持 native 方法的执行,存储了每个 native 方法调用的状态。 * 堆:用于存储所有通过 new 创建的对象的内存。 * 方法区:用于存储被装载的 class 的...

    Java 变量和数据类型

    当需要交换两个变量的值时,通常需要一个临时变量作为中介。例如,交换两个整数变量`num1`和`num2`的值: ```java int num1 = 19; int num2 = 89; int temp; temp = num1; num1 = num2; num2 = temp; ...

    C#.JAVA代码规范

    对于C#代码规范的详细内容,你可以查阅《C#代码规范.doc》,而对于Java代码规范的深入实践,可以参考《Java代码规范及实践.pdf》。记住,好的代码规范是优秀软件的基础,是每个专业开发者不可或缺的工具。

    Java 变量类型总结.pdf

    Java 变量是编程语言中...类变量用于表示类的共有属性,实例变量代表对象的特性,而局部变量则用于在特定方法或代码块中临时存储数据。理解和正确使用这些变量类型是Java编程的基础,有助于构建高效、可维护的代码。

    Java编程代码性能优化

    Java编程代码性能优化是软件开发中的重要环节,其目的是提高程序执行效率,降低资源消耗,同时也要保持代码的可读性和可维护性。本文将详细探讨优化Java代码的一些最佳实践和策略。 首先,我们优化代码的主要目标有...

    谷歌Java开发规范.rar

    1. **命名规则**:Java代码中的变量、方法、类名应使用有意义的驼峰式命名,如首字母大写的类名(ClassName)和首字母小写的变量名(variableName)。常量使用全大写字母并用下划线分隔(CONSTANT_NAME)。包名则...

    java代码的优化的技巧

    以上提到的Java代码优化技巧,涵盖了从变量声明、数据结构选择到资源管理等多个方面。开发者应根据具体的应用场景灵活运用这些策略,以达到提升程序性能、降低资源消耗的目的。通过持续学习和实践,逐步掌握这些技巧...

    java代码块测试.zip

    Java代码块测试是软件开发过程中一个重要的环节,它主要用于验证代码的功能是否按预期工作。JUnit是Java编程语言中最常用的单元测试框架,它为开发者提供了一种简洁、高效的测试工具,可以编写可重复运行的测试用例...

    Java中变量的存储位置

    接下来,我们通过几个具体的Java代码示例来进一步理解变量的存储位置。 1. **字符串** - 当直接使用双引号定义字符串时(例如`String s = "hello";`),字符串常量会被存放在常量池中。 - 当使用`new String()`...

    Java各种排序算法代码.zip

    Java实现中,可以使用一个临时变量存储当前元素,然后向左移动已排序元素,直到找到合适的位置插入。 3. 选择排序(Selection Sort): 选择排序每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列...

    Java编程性能优化技巧有哪些共7页.pdf.zip

    以下是一些常见的Java编程性能优化技巧,这些技巧覆盖了代码编写、内存管理、垃圾回收、并发处理等多个方面。 1. **选择合适的数据结构**:根据实际需求选择最高效的数据结构,如ArrayList与LinkedList在不同场景下...

Global site tag (gtag.js) - Google Analytics