- 浏览: 327178 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenfang_0913:
您好,我按照您的方法在Windows端进行了实现,可是我一直捕 ...
java实现网卡数据包抓取学习 -
wps886:
google了半天全是错的,只有楼主的xml配置有用,太感谢了 ...
奇怪的400 BAD REQUEST -
laputa73:
node.addEventListener('mouseup' ...
网络拓扑图DEMO -
njyyao:
单击、双击、右击的事件处理事件?
网络拓扑图DEMO -
lilinshtandby:
不错不错,赞一个
dhtmlxTree总结
Java程序类中可以存在多种形式的变量,Java类一般有种变量:成员变量、静态变量、临时变量。本文将介绍这三种变量的存取效率。
1、测试
下面作个实验,看下面代码。
class CheckVars {
private int instVar;// 成员变量
private static int staticVar; // 静态变量
// 存取类方法中的临时变量
void tempAccess(int val) {
int j = 0;// 临时变量
long startTime = System.currentTimeMillis();
for (int i = 0; i < val; i++)
j += 1;
long endTime = System.currentTimeMillis();
System.out.println("temp var: " + (endTime - startTime) + " milli seconds");
}
// 存取类的成员变量
void instanceAccess(int val) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < val; i++)
instVar += 1;
long endTime = System.currentTimeMillis();
System.out.println("instance var: " + (endTime - startTime) + " milli seconds");
}
// 存取类的 static 变量
void staticAccess(int val) {
long startTime = System.currentTimeMillis();
for (int i = 0; i < val; i++)
staticVar += 1;
long endTime = System.currentTimeMillis();
System.out.println("static var: " + (endTime - startTime) + " milli seconds");
}
public static void main(String[] args){
CheckVars test=new CheckVars();
test.tempAccess(200000000);
test.instanceAccess(200000000);
test.staticAccess(200000000);
}
}
|
结果:
temp var: 350 milli seconds iE8itug
instance var: 821 milli secondsiE8itug
static var: 852 milli seconds
这段代码中的每个方法都执行相同的循环,并反复相同的次数。唯一的不同是每个循环使一个不同类型的变量递增。方法tempAccess 使一个局部堆栈变量递增,instanceAccess 使类的一个成员实例变量递增,而staticAccess 使类的一个static 变量递增。
从结果中可以发现,instanceAccess 和staticAccess 的执行时间基本相同。但是,tempAccess 要快两到三倍。
2、JVM存取变量机制
存取堆栈变量如此快是因为JVM 存取堆栈变量比它存取static 变量或类的实例变量执行的操作少。JVM 是一种基于堆栈的虚拟机,因此优化了对堆栈数据的存取和处理。所有局部变量都存储在一个局部变量表中,在Java 操作数堆栈中进行处理,并可被高效地存取。
存取static变量和实例变量成本更高,因为JVM 必须使用代价更高的操作码,并从常数存储池中存取它们。(常数存储池保存一个类型所使用的所有类型、字段和方法的符号引用。)通常,在第一次从常数存储池中访问static 变量或实例变量以后,JVM 将动态更改字节码以使用效率更高的操作码。尽管有这种优化,堆栈变量的存取仍然更快。
3、优化代码
考虑到这些事实,就可以重新构建前面的代码,以便通过存取堆栈变量而不是实例变量或static 变量使操作更高效。
public class CheckVarsAdv {
private int instVar;
private static int staticVar;
void tempAccess(int val) {
int j = 0;
long startTime = System.currentTimeMillis();
for (int i = 0; i < val; i++)
j += 1;
long endTime = System.currentTimeMillis();
System.out.println("temp var: " + (endTime - startTime) + " milli seconds");
}
void instanceAccess(int val) {
int j = instVar;
long startTime = System.currentTimeMillis();
for (int i = 0; i < val; i++)
j += 1;
long endTime = System.currentTimeMillis();
System.out.println("instance var: " + (endTime - startTime) + " milli seconds");
instVar = j;
}
void staticAccess(int val) {
int j = staticVar;
long startTime = System.currentTimeMillis();
for (int i = 0; i < val; i++)
j += 1;
long endTime = System.currentTimeMillis();
System.out.println("static var: " + (endTime - startTime) + " milli seconds");
staticVar = j;
}
public static void main(String[] args){
CheckVarsAdv test=new CheckVarsAdv();
test.tempAccess(200000000);
test.instanceAccess(200000000);
test.staticAccess(200000000);
}
}
|
结果:
temp var: 341 milli secondsiE8itug
instance var: 370 milli secondsiE8itug
static var: 361 milli seconds
方法:instanceAccess和 staticAccess 被修改为将它们的实例变量或static 变量复制到局部堆栈变量中。当变量的处理完成以后,其值又被复制回实例变量或static 变量中。这种简单的更改明显提高了instanceAccess 和staticAccess 的性能。这三个方法的执行时间现在基本相同。
转载自:http://www.itug.cn/Procedures/Java/20071113/1757.htm
发表评论
-
java 返回文件大小(带单位)
2014-10-28 09:46 970原文:http://hhhk.iteye.com/blog ... -
InputStream中转实现
2014-06-11 21:08 1122需求: 程序仅实现对InputStream的中转,传入In ... -
POI3.8对EXCEL的读写
2012-08-18 17:10 2372package poi.excel; impor ... -
深入学习GridBagLayout
2011-08-18 10:58 1843利用Java来创建图 ... -
Spring相关jar包简介
2011-05-12 20:53 1471前半部分spring本身的包 ... -
使用httpclient发送SOAP请求
2011-02-14 11:16 5174package com.cordyschina.apptool ... -
eclipse生成javadoc乱码解决
2010-04-19 16:07 2929eclipse在生成javadoc的时候出现乱码,是因为ecl ... -
printStackTrace 实现
2010-03-18 17:11 1676我们一般在catch中喜欢写e.printStackTrace ... -
Lucene:基于Java的全文检索引擎简介
2010-02-08 15:53 1002作者:车东 发表于:200 ... -
derby 分页
2010-01-13 12:54 17145.2. Does Derby support a LIMIT ... -
derby & cloudscape常用操作和工具总结<转>
2010-01-13 12:47 1574derby 是IBM捐赠给apache的java数据库实 ... -
数据库中主键和外键的设计原则<转>
2010-01-11 15:58 1326http://www.cnblogs.com/tianyamo ... -
不能读取记录;在MSysObjects上没有读取数据权限
2010-01-09 17:23 3931当我读取ACCESS里的系统表MSysObjects时,出现: ... -
java打包exe 制作安装包 With JRE 自启动
2009-12-21 14:23 3017来自:http://hi.baidu.com/adanren/ ... -
myeclipse6最新注册码
2009-12-15 23:29 1071maxwell / zLR8ZC-855575-676769 ... -
java实现使用代理服务器创建URL连接
2009-11-01 10:22 2797package cn.arthurs.web; import ... -
可更新的ResultSet
2009-09-16 16:59 1444如果我遍历一个结果集的时候,操作完一条数据,希望更新一下这条记 ... -
高效创建XML工具(WAX)
2009-09-13 01:46 1725WAX是一个用于创建大型XML文档的高效工具。与其它XML操作 ... -
pl/sql developer中的表过滤
2009-06-05 23:47 6054PL/SQL Developer用于连接oracle是比较好的 ... -
五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
2008-11-17 12:34 1271当Adobe、Microsoft、Sun等一系列巨头开始表现出 ...
相关推荐
尽可能将参数和临时变量设计为局部变量,减少对堆的依赖。 6. **包装类型与基本类型的权衡**:包装类型(Integer, Double等)是对象,存在于堆中,而基本类型(int, double等)在栈中处理。根据需求选择合适的类型...
在本篇文章中,我们将分享一些Java代码技巧,以提高程序性能。这些技巧虽然看起来微不足道,但是可以为系统性能带来成倍的提升。 首先,让我们来讨论try-catch语句的使用。在Java开发中,try-catch语句经常用于错误...
这种方式适用于简单或临时性的Java代码,对于复杂的业务逻辑,推荐使用Java Class步骤。 在提供的压缩包文件中,有两个`.ktr`文件,分别是`commons.md5.ktr`和`custom.md5.ktr`。这两个文件是Kettle的转换文件,...
合理使用局部变量,避免过多的临时变量。 ### Java 5.0特性 Java 5引入了许多新特性,如枚举、泛型、自动装箱/拆箱、可变参数等,编码时应充分利用这些特性,提高代码的类型安全性和可读性。 ### 性能 优化性能时...
3. 尽量使用局部变量:调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。 Java 中的局部变量保存在栈中,而实例变量和静态变量保存在堆(Heap)中。使用局部变量可以提高性能。 4...
环境变量可以指定命令搜索路径、类搜索路径和 JDK 安装目录等,正确地配置环境变量可以提高开发效率和应用性能。 二、配置 JDK 的环境变量 1. PATH 环境变量 PATH 环境变量的作用是指定命令搜索路径,在 shell ...
以下是一些常见的Java代码优化建议: 1. **字符串操作优化** - 对于不会改变的常量字符串,应优先使用`String`而非`StringBuffer`。这是因为`String`对象是不可变的,而`StringBuffer`适用于频繁拼接操作,但会...
5. 使用流API:Java 8引入的流API允许链式操作,减少了临时对象的生成,提高了性能。 6. 利用编译器优化:现代的Java编译器(如JIT)会进行一些运行时优化,如逃逸分析,识别出某些对象不会逃逸出当前作用域,从而...
5. 局部变量:临时变量放在栈中,访问速度快;静态变量、实例变量放在堆中,速度较慢。 6. 包装类型与基本类型:基本类型在栈中处理,速度快;包装类型是对象,在堆中创建,速度慢。建议在集合类对象中使用包装类型...
* 栈:用于存放临时变量、参数和中间结果。 * 本地方法栈:用于支持 native 方法的执行,存储了每个 native 方法调用的状态。 * 堆:用于存储所有通过 new 创建的对象的内存。 * 方法区:用于存储被装载的 class 的...
当需要交换两个变量的值时,通常需要一个临时变量作为中介。例如,交换两个整数变量`num1`和`num2`的值: ```java int num1 = 19; int num2 = 89; int temp; temp = num1; num1 = num2; num2 = temp; ...
对于C#代码规范的详细内容,你可以查阅《C#代码规范.doc》,而对于Java代码规范的深入实践,可以参考《Java代码规范及实践.pdf》。记住,好的代码规范是优秀软件的基础,是每个专业开发者不可或缺的工具。
Java 变量是编程语言中...类变量用于表示类的共有属性,实例变量代表对象的特性,而局部变量则用于在特定方法或代码块中临时存储数据。理解和正确使用这些变量类型是Java编程的基础,有助于构建高效、可维护的代码。
Java编程代码性能优化是软件开发中的重要环节,其目的是提高程序执行效率,降低资源消耗,同时也要保持代码的可读性和可维护性。本文将详细探讨优化Java代码的一些最佳实践和策略。 首先,我们优化代码的主要目标有...
1. **命名规则**:Java代码中的变量、方法、类名应使用有意义的驼峰式命名,如首字母大写的类名(ClassName)和首字母小写的变量名(variableName)。常量使用全大写字母并用下划线分隔(CONSTANT_NAME)。包名则...
以上提到的Java代码优化技巧,涵盖了从变量声明、数据结构选择到资源管理等多个方面。开发者应根据具体的应用场景灵活运用这些策略,以达到提升程序性能、降低资源消耗的目的。通过持续学习和实践,逐步掌握这些技巧...
Java代码块测试是软件开发过程中一个重要的环节,它主要用于验证代码的功能是否按预期工作。JUnit是Java编程语言中最常用的单元测试框架,它为开发者提供了一种简洁、高效的测试工具,可以编写可重复运行的测试用例...
接下来,我们通过几个具体的Java代码示例来进一步理解变量的存储位置。 1. **字符串** - 当直接使用双引号定义字符串时(例如`String s = "hello";`),字符串常量会被存放在常量池中。 - 当使用`new String()`...
Java实现中,可以使用一个临时变量存储当前元素,然后向左移动已排序元素,直到找到合适的位置插入。 3. 选择排序(Selection Sort): 选择排序每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列...
以下是一些常见的Java编程性能优化技巧,这些技巧覆盖了代码编写、内存管理、垃圾回收、并发处理等多个方面。 1. **选择合适的数据结构**:根据实际需求选择最高效的数据结构,如ArrayList与LinkedList在不同场景下...