用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变量,从而提高了代码的性能。

时间: 2024-09-02 17:00:46

用stack变量优化Java代码的相关文章

使用技巧:内部类和匿名类优化Java代码

技巧|优化 Java 1.1通过对Java语言规范进行修改,显著简化了一些实用结构的实现.在那些修改中,最引人注目的就是内部类和匿名类.如运用得当,它们可使程序更易理解和维护.下面来看看这些特性具体是如何工作的,如何正确使用它们,以及如何避免一些常见的错误. 内部类 简单地说,"内部类"是在另一个类的内部声明的类.从Java 1.1开始,你可在一个类中声明另一个类,这与声明字段和方法非常相似.包装了内部类声明的类就称为"外部类". 实际上,Java语言规范还允许你做

使用内部和匿名类优化Java代码

优化 Java 1.1通过对Java语言规范进行修改,显著简化了一些实用结构的实现.在那些修改中,最引人注目的就是内部类和匿名类.如运用得当,它们可使程序更易理解和维护.下面来看看这些特性具体是如何工作的,如何正确使用它们,以及如何避免一些常见的错误.    内部类    简单地说,"内部类"是在另一个类的内部声明的类.从Java 1.1开始,你可在一个类中声明另一个类,这与声明字段和方法非常相似.包装了内部类声明的类就称为"外部类".    实际上,Java语言规

优化-java代码中有个循环,数据量一大直接网页报500错误

问题描述 java代码中有个循环,数据量一大直接网页报500错误 求大神帮忙优化一下,10000数据还可以,但是数据一多网页就崩溃了,就是代码中的row++,加上去就不行了 解决方案 结果是内存益处了 那就是你的程序太耗费资源了. 那个获取page的方法: 1--Page对象村的东西太多了,很多何你写入单元格的数据没关系, 既然这块逻辑是大数据量的,为什么不拆分针对这块逻辑的结构呢? 使用Page造成了很大的内存浪费 在循环外部定义这个结构 List list = null 2--将方法的参数精

使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告

概述 BEAM 报告的结果文件是通过 build.xml 中 --beam::complaint_file 所定义的,在这 里,本文假设其为 BEAM-messages.BEAM-messages 记录着报出的所有代码缺陷,这些缺陷 分为 ERROR,MISTAKE 和 WARNING 三大类,严重程度依次递减.每一个具体的 ERROR, MISTAKE 和 WARNING 都代表着一个错误模式,本文接下来就通过实例分析理解其中的某些 重要错误模式,告诉读者在写 Java 代码时如何避免这些错误

使用 IBM 静态工具优化 Java 代码,第 1 部分: 工具入门

什么是 BEAM? 关于缩写 BEAM 的声明 处于表达简洁的目的,本文采用了工具名称的缩写 - BEAM,这只是工具全称 "Checking Tool for Bugs Errors and Mistakes"的文字缩写,而不是工具的名称. IBM Checking Tool for Bugs Errors and Mistakes(本文后面将采用其文字缩写 BEAM )是 IBM 开发的一个静态分析工具,可以用于分析并查找出 C, C++ 和 Java 代码中的一 些不容易发现的潜

Linkedin工程师是如何优化他们的Java代码的(转)

  英文原文:LinkedIn Feed: Faster with Less JVM Garbage 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公司主页以及客户端等多个分发渠道提供支撑(如下图所示). 在Feed Mixer里面用到了一个叫做SPR(念"super")的库.博文讲的就是如何优化SPR的java代码.下面就是他们总结的

内存分配-java中非静态成员变量和构造代码块的先后加载问题

问题描述 java中非静态成员变量和构造代码块的先后加载问题 如果在java中同时存在构造代码块和非静态成员变量,请问他们的先后加载顺序?是顺序加载么? 例如: public Test{ { a =2.4f; System.out.println("构造代码块"); } float a =100; public static void main(String[] args) { System.out.println(new Test().a); } } 结果a = 100.0 publ

Linkedin 工程师如何优化他们的 Java 代码

最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公司主页以及客户端等多个分发渠道提供支撑(如下图所示). 在Feed Mixer里面用到了一个叫做SPR(念"super")的库.博文讲的就是如何优化SPR的java代码.下面就是他们总结的优化经验. 1. 谨慎对待Java的循环遍历 Java中的列表遍历可比它看起来要麻烦多了.就以下面两段

请教优化一段java代码

问题描述 请教各位,一下代码哪里能优化或者代码风格能优化的地方么,然后给个修改理由,非常感谢,初学java,希望知道哪样的才是工作中写的代码importorg.apache.commons.logging.LogFactory;publicclassAccountClass{privatefinaltransientstaticint[]values=newint[4];publicvoidaddValues(inti,intv){try{if(isOK(i)){values[i]=v;}}ca