用stack变量优化Java代码

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变量,从而提高了代码的性能。相关阅读:

关于CSS网页布局id与class的命名

影响Oracle中文显示的字符集分析

HTML5 CSS3新的WEB标准和浏览器支持

Asp备份与恢复SQL Server数据库

HTML5中div§ion&article之间的区别

Ajax获取页面被缓存的解决方案

帝国ECMS教程:上一篇下一篇自定义综合代码

PHP 中文乱码解决办法总结分析

基于css3仿造window7的开始菜单

secedit.exe本地安全策略命令使用方法

在jsp中用bean和servlet联合实现用户注册、登录

让你的.NET程序兼容不同版本的Dll文件

CMS是什么?认识CMS

GridView自定义分页的四种存储过程

asp java 变量_ASP_用stack变量优化Java代码,  java程序包含了大量的对象 - phpStudy...相关推荐

  1. java 概率 算法_使用概率算法优化快速排序(JAVA)

    前言 前面一篇文章系统介绍了快速排序算法,提到快速排序虽然平均时间复杂度为o(n*log2(n)),效率相对比较高.但是其在特殊情况下,比如降序的情况下,效率和冒泡排序一致,这就削弱了快速排序给人的好 ...

  2. java鼠标右击出现选择窗口_java菜单代码 java中鼠标右击弹出菜单怎样实现

    帮忙给一个java菜单栏例子的源代码 给你个小例子,已经添加注释了.自己运行下看看效果,满意的话记得结贴子. import java.awt.BorderLayout; import java.awt ...

  3. java tf值搜索_搜索引擎优化 TF_IDF之Java实现

    实现之前,我们要事先说明一些问题: 我们用Redis对数据进行持久化,存两种形式的MAP: key值为term,value值为含有该term的url key值为url,value值为map,记录ter ...

  4. java窗体 个人信心_帮忙写下代码java swing,个人信息实例

    展开全部 本人急忙62616964757a686964616fe59b9ee7ad9431333332636264做的:有什么不合要求的请再告诉我: package show; import java ...

  5. Android 性能优化 之谈谈Java内存区域

    最近一年副业主要在学习投资和技能学习,把以前学习内存分析的一些笔记总结发出来,写了很多笔记总结都没有写完就又忙着了,最近再次总结复习学习一遍,还有提醒各位同学一定要学会投资.. 了解Android 内 ...

  6. Android内存优化2 了解java内存分配 2

    JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区. ...

  7. 叩丁狼—Java培训实战教程之mysql优化

    Java培训实战教程之mysql优化 Java培训过程中精点.难点知识解析 1. mysql引擎1.1. 引擎类型MySQL常用的存储引擎为MyISAM.InnoDB.MEMORY.MERGE,其中I ...

  8. java中堆栈内存_Java堆空间与堆栈– Java中的内存分配

    java中堆栈内存 Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by ...

  9. java 线程栈大小配置,JVM运行时数据区详解-Stack栈(优化配置、代码样例)

    最近有段时间没有更新Netty的教程了,却发了一些其他的东西.可能有的朋友会问,难道这就完事了?不会的.两方面原因.第一.笔者也是需要工作的人,自然要完成好工作中的任务,这里面也有很多东西需要学习和研 ...

最新文章

  1. 面试官: 谈谈什么是守护线程以及作用 ?
  2. openFeign 服务接口的调用03—— OpenFeign 超时控制
  3. 【Python数据挖掘课程】四.决策树DTC数据分析及鸢尾数据集分析
  4. 几种Win7/Windows共享虚拟无线网络的方法及区别
  5. dbeaver连接mysql 驱动jar_用Intellij Idea创建一个普通的Java工程并用JDBC连接数据库...
  6. 【OpenJ_Bailian - 1258】【POJ - 1258】Agri-Net (最小生成树裸题)
  7. 使用多线程的方式调用chineseocr_API
  8. 生产环境频繁内存溢出,原来就是因为这个“String类”
  9. Mac OS X 更新JAMF域控配置
  10. ssh登录失败处理步骤
  11. 自定义表单提交后返回上一页修改
  12. 洛谷OJ - P1156 - 垃圾陷阱
  13. homework7_ZhankunLuo
  14. APIO2016游记
  15. 远程计算机怎么桌面显示不全,桌面显示不全怎么设置
  16. 双卡4G路由器_4G双卡双模路由器_4G双网双待路由器
  17. torchvision.datasets.FashionMNIST报错[WinError 10054] 远程主机强迫关闭了一个现有的连接
  18. Windows和Ubuntu搭建局域网中共享文件夹
  19. SG函数SG定理游戏的和公平组合游戏
  20. NB-IoT使用笔记(1)实现UDP访问DNS服务获取IP地址

热门文章

  1. 旅行家的预算[贪心]
  2. CDN全站加速助力企业云上升级
  3. HTML5 监听当前位置
  4. 开源 免费 java CMS - FreeCMS1.5-建站向导
  5. 局域网瘫痪 傀儡主机的DDoS***
  6. Android应用程序消息处理机制(Looper、Handler)分析(2)
  7. Silverlight中使用CompositionInitializer宿主MEF
  8. 大型网站架构演变和知识体系
  9. 正确生成浮点型的方法,解决sqlachemy Float浮点型的坑,生成float类型时,长度和精度均为0,导致查询不到结果!...
  10. Linux —— 目录(文件夹)及文件相关处理指令