网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.JBuilder2005实现重构之重命名.
.Javascript实例教程(1) 创建弹出.
.基本对象池的使用.
.利用JAVA操作EXCEL文件.
.Java嵌入式开发之j2me--五.
.仔细触摸Java编程中的“文档”和.
.十年之后 Java技术的新方向.
.Resin服务器平台介绍.
.关于J2EE中软件基础结构的瓶颈.
.JBUILDER 5 新特性.
.(翻译)classpath和环境变量设置.
.解决方案:确保无线 J2ME 的安全.
.Java桌面端程序开发.
.如何在SPRING中实现事务暂停.
.Weblogic6.0安装及配置.
.Java学习:解决J2ME中的内存泄漏.
.JBuilder4入门.
.快速在应用程序中将文件压缩成Zi.
.Adapter在J2SE事件处理中的应用.
.系统编程 在Java中处理日志记录.

Java: 尽可能使用堆栈变量

发表日期:2008-1-5


假如您频繁存取变量,就需要考虑从何处存取这些变量。变量是 static 变量,还是堆栈变量,或者是类的实例变量?变量的存储位置对存取它的代码的性能有明显的影响?例如,请考虑下面这段代码:

class StackVars
{
 private int instVar;
 private static int staticVar;
 
 //存取堆栈变量
 void stackAccess(int val)
 {
   int j=0;
   for (int i=0; i<val; i++)
     j += 1;
 }
 
 //存取类的实例变量
 void instanceAccess(int val)
 {
   for (int i=0; i<val; i++)
     instVar += 1;
 }  
 
 //存取类的 static 变量
 void staticAccess(int val)
 {
   for (int i=0; i<val; i++)
     staticVar += 1;
 }
}    

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

instanceAccess 和 staticAccess 的执行时间基本相同。但是,stackAccess 要快两到三倍。存取堆栈变量如此快是因为,JVM 存取堆栈变量比它存取 static 变量或类的实例变量执行的操作少。请看一下为这三个方法生成的字节码:

Method void stackAccess(int)
  0 iconst_0         //将 0 压入堆栈。
  1 istore_2         //弹出 0 并将它存储在局部分变量表中索引为 2 的位置 (j)。
  2 iconst_0         //压入 0。
  3 istore_3         //弹出 0 并将它存储在局部变量表中索引为 3 的位置 (i)。
  4 goto 13          //跳至位置 13。
  7 iinc 2 1         //将存储在索引 2 处的 j 加 1。
 10 iinc 3 1         //将存储在索引 3 处的 i 加 1。
 13 iload_3          //压入索引 3 处的值 (i)。
 14 iload_1          //压入索引 1 处的值 (val)。
 15 if_icmplt 7      //弹出 i 和 val。假如 i 小于 val,则跳至位置 7。
 18 return           //返回调用方法。
 
Method void instanceAccess(int)
  0 iconst_0         //将 0 压入堆栈。
  1 istore_2         //弹出 0 并将它存储在局部变量表中索引为 2 的位置 (i)。
  2 goto 18          //跳至位置 18。
  5 aload_0          //压入索引 0 (this)。
  6 dup              //复制堆栈顶的值并将它压入。
  7 getfield #19 <Field int instVar>
                     //弹出 this 对象引用并压入 instVar 的值。
 10 iconst_1         //压入 1。
 11 iadd             //弹出栈顶的两个值,并压入它们的和。
 12 putfield #19 <Field int instVar>
                     //弹出栈顶的两个值并将和存储在 instVar 中。
 15 iinc 2 1         //将存储在索引 2 处的 i 加 1。

上一篇:Jive源代码研究 人气:768
下一篇:JAVA加密解密---自定义类加载器应用 人气:1759
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐