java程序包含了大量的对象,我们需要了解它们是从哪里被访问的,变量存储于何处对程序的性能有显著的影响--尤其是某些需要被频繁访问的变量。
我们写一个Java类,在其内部方法中定义的局部变量或对象是存储在stack(堆栈)中的,且JVM是一种stack-based的,因此访问和操纵stack中的数据时性能最佳。而Java类的instance变量(这个类的field)和static变量是在constantpool(常量池)中存储和得到访问的。constantpool中保存了所有的符号引用(symbolicreferences),指向所有型别(types)、值域(field),以及每个型别所使用的所有函数(mothods)。访问instance和static变量时,由于它们存放于constantpool中,所以JVM需要使用更多更耗时的操作码(分析程序生成的bytecode可以看出来)来访问它们。
下面给出一段代码示例,对比后说明怎么尽可能地使用stack变量:
packagetest;
publicclassStackVars{
privateintx;//instance变量
privatestaticintstaticX;//static变量
publicvoidstackAccess(intval){//访问和操作stack变量j
intj=0;
for(inti=0;i<val;i++){
j+=1;
}
}
publicvoidinstanceAccess(intval){//访问和操作instance变量x
for(inti=0;i<val;i++){
x+=1;
}
}
publicvoidstaticAccess(intval){//访问和操作static变量staticX
for(inti=0;i<val;i++){
staticX+=1;
}
}
}
经测试,发现运行instanceAccess()和staticAccess()方法的时间大约相同,但却比运行stackAccess()方法慢了2~3倍。因此我们对instanceAccess()、staticAccess()两个方法的代码作以下调整,以得到更快的性能:
publicvoidinstanceAccess(intval){//访问和操作instance变量x
inttempX=x;
for(inti=0;i<val;i++){
tempX+=1;
}
x=tempX;
}
publicvoidstaticAccess(intval){//访问和操作static变量staticX
inttempStaticX=staticX;
for(inti=0;i<val;i++){
tempStaticX+=1;
}
staticX=tempStaticX;
}
改善之处就是将instance和static变量放到循环之外,而用一个stack变量来完成多次局部运算,最后再将这个stack变量的值传回instance或static变量,从而提高了代码的性能。
原文链接:http://www.cc580.com/article/sort015/info-3169.html
分享到:
相关推荐
2. **使用局部变量**:尽量使用局部变量代替全局变量或对象成员,减少对象的引用查找开销。 3. **避免同步块**:同步块会降低多线程程序的并发性能,除非确实需要同步。 4. **使用缓存**:对于经常重复计算的结果,...
5. **代码优化**:避免冗余计算,使用局部变量存储重复计算的结果,减少方法调用。同时,注意消除空指针异常,减少异常处理的开销。 6. **延迟加载与懒初始化**:对于不立即需要的资源,可采用延迟加载策略,只在...
5. **优先使用局部变量**:局部变量在栈中存储,访问速度快。尽量减少实例变量和静态变量的使用,除非必要。 6. **包装类型与基本类型的使用**:根据场景选择使用包装类型或基本类型。包装类型适用于对象操作,基本...
4. 使用局部变量:避免在循环中使用方法调用来获取对象,这会增加额外的开销。 三、算法和数据结构优化 选择合适的算法和数据结构对程序性能至关重要。例如,优先使用ArrayList而非LinkedList进行遍历操作,因为...
例如,对于频繁执行的操作,应尽量使用局部变量而不是每次调用方法;尽量使用StringBuilder或StringBuffer来拼接字符串,避免使用"+"操作符导致的大量字符串对象创建;选择适合场景的集合类,如ArrayList适用于随机...
根据提供的文件信息,以下是关于Java性能优化的详细知识点,内容包括单例模式的合理应用、静态变量的使用考量、对象创建与垃圾回收策略、final修饰符与内联优化、局部变量与实例变量的性能差异、包装类型与基本类型...
1. **循环中的局部变量**:应避免在循环中定义局部变量,这样可以减少内存的频繁分配与释放,降低垃圾回收的压力。 2. **集合类的选择**: - `ArrayList` 性能优于 `Vector`,除非你需要线程安全的集合。 - `...
3. **合理利用final关键字**:final可以提升方法内局部变量的访问速度,并有助于编译器进行优化。 4. **减少对象创建**:过多的对象创建会导致垃圾收集频繁,考虑复用或使用池化技术。 5. **避免大量使用...
因此,应该尽量使用局部变量,而不是静态变量或实例变量。 1.7 乘法和除法 应该尽量避免使用乘法和除法运算,因为它们比其他运算符慢得多。可以使用其他方法来实现这些运算,例如使用位移运算符。 二、J2EE 篇 ...
4. **使用局部变量**:尽可能减少方法的参数,避免方法间共享对象,提高局部性原理的利用。 5. **避免空对象检查**:如果可能,使用Optional类来封装可能为null的对象,减少显式的null检查。 6. **使用equals()与...
### Java性能优化关键知识点 #### 一、合理运用单例模式 - **目的**:单例模式主要用于控制资源使用、节约资源以及实现跨进程或线程间的通信。 - **应用场景**: - 控制资源使用:通过线程同步机制限制资源的并发...
尽量使用局部变量 局部变量存储在栈中,访问速度快于堆中的对象。因此,对于那些生命周期较短、不需要长时间存在的变量,优先考虑使用局部变量。 #### 6. 慎重处理包装类型和基本类型的使用场景 基本类型和包装...
在Java性能优化中,合理使用单例模式可以带来以下优势: 1. **控制资源使用**:通过线程同步来控制资源的并发访问,尤其是在多线程环境下,可以有效减少资源竞争,提高资源利用率。 2. **控制实例产生**:减少不必...
### Java代码性能优化的关键知识点 在开发过程中,代码性能优化是一项至关重要的工作,尤其是在Java这样的广泛应用的语言中。本文将从给定的文件信息出发,详细阐述如何通过一系列具体的方法来提高Java代码的质量与...
- **优化建议**: 尽可能使用局部变量,并利用编译器/虚拟机对局部变量的优化机制。 **1.7 乘法和除法** - **背景**: 直接使用乘法和除法运算符可能导致性能下降。 - **优化建议**: 考虑使用移位操作代替乘法和除法...
在可能的情况下,尽量使用局部变量,避免不必要的对象创建和垃圾回收。 4. 不要重复初始化变量:Java会在构造函数中默认初始化变量,避免在代码中重复初始化,以减少不必要的计算。 5. SQL语句规范:在Oracle...
6. 尽量使用局部变量,可以减少内存的使用。 7. 乘法和除法操作可以使用乘法和除法代替,可以减少计算的时间。 8. 尽量重用对象,可以减少对象的创建。 J2EE 篇 在 J2EE 篇中,我们讨论了一些 J2EE 相关的性能优化...
在Java编程中,优化性能是开发者必须关注的重要环节。以下是一些关键的性能优化细节: 1. **使用单例模式**:单例模式可以确保一个类只有一个实例,从而节省资源和提高效率。不过,过度使用单例可能导致设计复杂性...