Java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量。
我们写一个Java类,在其内部方法中定义的局部变量或对象是存储在stack(堆栈)中的,且JVM是一种stack-based的,因此访问和操纵stack中的数据时性能最佳。而Java类的instance变量(这个类的field)和static变量是在constant pool(常量池)中存储和得到访问的。constant pool中保存了所有的符号引用(symbolic references),指向所有型别(types)、值域(field),以及每个型别所使用的所有函数(mothods)。访问instance和static变量时,由于它们存放于constant pool中,所以JVM需要使用更多更耗时的操作码(分析程序生成的bytecode可以看出来)来访问它们。
下面给出一段代码示例,对比后说明怎么尽可能地使用stack变量:
package test;
public class StackVars {
private int x; // instance变量
private static int staticX; //static 变量
public void stackAccess(int val) { //访问和操作stack变量j
int j = 0;
for (int i = 0; i < val; i ) {
j = 1;
}
}
public void instanceAccess(int val) {//访问和操作instance变量x
for (int i = 0; i < val; i ) {
x = 1;
}
}
public void staticAccess(int val) {//访问和操作static变量staticX
for (int i = 0; i < val; i ) {
staticX = 1;
}
}
}
经测试,发现运行instanceAccess()和staticAccess()方法的时间大约相同,但却比运行stackAccess()方法慢了2~3倍。因此我们对instanceAccess()、staticAccess()两个方法的代码作以下调整,以得到更快的性能:
public void instanceAccess(int val) {//访问和操作instance变量x
int tempX=x;
for (int i = 0; i < val; i ) {
tempX = 1;
}
x=tempX;
}
public void staticAccess(int val) {//访问和操作static变量staticX
int tempStaticX=staticX;
for (int i = 0; i < val; i ) {
tempStaticX = 1;
}
staticX=tempStaticX;
}
改善之处就是将instance和static变量放到循环之外,而用一个stack变量来完成多次局部运算,最后再将这个stack变量的值传回instance或static变量,从而提高了代码的性能。
分享到:
相关推荐
用java实现的栈Stack类,不继承任何集合类,用对象数组实现
栈的实现,Stack栈使用符号进出 静态栈,与链表栈的实例
stack栈,如何使用栈,如何学好栈就下载此文档,很全的,谢谢啦,数据结构与算法!!!
TI+Z stack协议栈开发环境和工作流程
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据...
通过Java面向对象思想和类的封装性完成栈的类设计,选择合适的底层存储结构,完成栈的判空isEmpty()、进栈push()、出栈pop()、取栈顶元素peek(),栈存储的对象以泛型给出。并和Java中的Stack的类以及功能进行比较...
用java写的stack小程序
zigbee ,z_stack 协议栈详细 教程 资料。一步一步教你。
用java写的简单栈的实现,欢迎大家使用
可运行C语言版本参考严蔚敏版本的数据结构与算法书,希望对正在学习的同学或者考研的同学有所帮助,我的代码都是在VC6.0上编写,编译。 #ifndef MAZE_H_ #define MAZE_H_ #include "stack.h" /** * position */ ...
使用java实现stack的源码与测试案例。
介绍数据结构栈(Stack)的概念、特点、优缺点、适用场景和Java示例代码
JAVA小程序 CharStack.java 包括push() pop() isEmpty() peek() isFull() RepOk()方程
堆栈(stack)是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出
Beckhoff Automation的EtherCAT Slave Stack Code(SSC)是ANSI C中的示例源代码,支持μC和SPI接口。 该代码作为在具有自己的处理器的设备中实现EtherCAT的开发基础。 “对象字典工具”(OD-Tool)已集成到SSC OD...
主要介绍了java中stack(栈)的使用代码实例,具有一定借鉴价值,需要的朋友可以参考下。
此方法是通过java提供的ArrayList方法对栈的实现;
有关于栈的创建、入栈、出栈操作 采用模板类实现
这是基于zigbee的协议栈,代码部分开源,大家可以修改上层的应用层,进行代码的开发
协议栈-Z-Stack协议栈基础和数据传输实验.doc