- 浏览: 1049267 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (538)
- 奇文共赏 (36)
- spring (13)
- hibernate (10)
- AOP/Aspectj (9)
- spring security (7)
- lucence (5)
- compass (3)
- jbmp (2)
- jboss rule(drools) (0)
- birt (1)
- jasper (1)
- cxf (3)
- flex (98)
- webgis (6)
- 设计模式 (1)
- 代码重构 (2)
- log4j (1)
- tomcat (9)
- 神品音乐 (1)
- 工作计划 (2)
- appfuse (1)
- svn (4)
- 寻章摘句 (3)
- eclipse (10)
- arcgis api for flex (1)
- 算法 (5)
- opengis-cs (1)
- bug心得 (13)
- 图标 (1)
- software&key (14)
- java (17)
- 搞笑视频 (13)
- sqlserver (9)
- postgresql (1)
- postgis (0)
- geoserver (5)
- 日子 (50)
- 水晶报表 (1)
- 绝对电影 (3)
- Alternativa3D (1)
- 酷站大全 (10)
- c++ (5)
- oracle (17)
- oracle spatial (25)
- flashbuilder4 (3)
- TweenLite (1)
- DailyBuild (6)
- 华山论贱 (5)
- 系统性能 (5)
- 经典古文 (6)
- SOA/SCA/OSGI (6)
- jira (2)
- Hadoop生态圈(hadoop/hbase/pig/hive/zookeeper) (37)
- 风水 (1)
- linux操作基础 (17)
- 经济 (4)
- 茶 (3)
- JUnit (1)
- C# dotNet (1)
- netbeans (1)
- Java2D (1)
- QT4 (1)
- google Test/Mock/AutoTest (3)
- maven (1)
- 3d/OSG (1)
- Eclipse RCP (3)
- CUDA (1)
- Access control (0)
- http://linux.chinaunix.net/techdoc/beginner/2008/01/29/977725.shtml (1)
- redis (1)
最新评论
-
dove19900520:
朋友,你确定你的标题跟文章内容对应???
tomcat控制浏览器不缓存 -
wussrc:
我只想说牛逼,就我接触过的那点云计算的东西,仔细想想还真是这么 ...
别样解释云计算,太TM天才跨界了 -
hw_imxy:
endpoint="/Hello/messagebr ...
flex+java代码分两个工程 -
gaohejie:
rsrsdgrfdh坎坎坷坷
Flex 与 Spring 集成 -
李涤尘:
谢谢。不过说得有点太罗嗦了。
Oracle数据库数据的导入及导出(转)
http://looxiaohu.iteye.com/blog/206790
整理了一些影响性能的代码和优化方法,以后希望能陆续补充和优化
1. 如何使用Exception
Exception降低性能。一个异常抛出首先需要创建一个新的对象。Throwable接口中的构造器调用名为fillInStackTrace()的本地方法。这个方法负责巡检栈的整个框架来收集跟踪信息。这样无论何时有异常抛出,它要求虚拟机装载调用栈,因为一个新的对象在中部被创建。
异常应当仅用于有错误发生时,而不要控制流。
2. 不要两次初始化变量
Java通过调用独特的类构造器默认地初始化变量为一个已知的值。所有的对象被设置成null,integers (byte, short, int, long)被设置成0,float和double设置成0.0,Boolean变量设置成false。这对那些扩展自其它类的类尤其重要,这跟使用一个新的关键词创建一个对象时所有一连串的构造器被自动调用一样。
3. 在任何可能的地方让类为Final
标记为final的类不能被扩展。在《核心Java API》中有大量这个技术的例子,诸如java.lang.String。将String类标记为final阻止了开发者创建他们自己实现的长度方法。
更深入点说,如果类是final的,所有类的方法也是final的。Java编译器可能会内联所有的方法(这依赖于编译器的实现)。在我的测试里,我已经看到性能平均增加了50%。
4. 在任何可能的地方使用局部变量
属于方法调用部分的自变量和声明为此调用一部分的临时变量存储在栈中,这比较快。诸如static,实例(instance)变量和新的对象创建在堆中,这比较慢。局部变量的更深入优化依赖于你正在使用的编译器或虚拟机。
5. 停止小聪明
很多开发人员在脑子中编写可复用和灵活的代码,而有时候在他们的程序中就产生额外的开销。曾经或者另外的时候他们编写了类似这样的代码:
public void doSomething(File file) {
FileInputStream fileIn = new FileInputStream(file);
// do something
他够灵活,但是同时他们也产生了更多的开销。这个主意背后做的事情是操纵一个InputStream,而不是一个文件,因此它应该重写如下:
public void doSomething(InputStream inputStream){
// do something
6. 乘法和除法
我有太多的东东适用于摩尔法则——它声明CPU功率每年成倍增长。"摩尔法则"表明每年由开发者所写的差劲的代码数量三倍增加,划去了摩尔法则的任何好处。
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { shiftX = val * 8; myRaise = val * 2; }
如果我们狡猾的利用位移(bit),性能将会六倍增加。这是重写的代码:
for (val = 0; val < 100000; val += 5) { shiftX = val << 3; myRaise = val << 1; }
代替了乘以8,我们使用同等效果的左移3位。每一个移动相当于乘以2,变量myRaise对此做了证明。同样向右移位相当于除以2,当然这会使执行速度加快,但可能会使你的东东以后难于理解;所以这只是个建议
7. 用代码有效处理内存溢出
OutOfMemoryError是由于内存不够后普遍会遇到的问题,下面一段代码能有效判断内存溢出错误,并在内存溢出发生时有效回收内存
通过该方法可以联想到有效管理连接池溢出,道理等同。
Java代码
import java.util.*;
public class DataServer
{
private Hashtable data = new Hashtable();
public Object get (String key)
{
Object obj = data.get (key);
if (obj == null)
{
System.out.print (key + “ ”);
try
{
// simulate getting lots of data
obj = new Double[1000000];
data.put (key, obj);
}
catch (OutOfMemoryError e)
{
System.out.print (“\No Memory! ”);
flushCache();
obj = get (key);// try again
}
}
return (obj);
}
public void flushCache()
{
System.out.println (“Clearing cache”);
data.clear();
}
public static void main (String[] args)
{
DataServer ds = new DataServer();
int count = 0;
while (true) // infinite loop for test
ds.get (“” + count++);
}
}
8. Lazy Loading (Lazy evaluation)在需要装入的时候才装入
Java代码
static public long
factorial( int n ) throws IllegalArgumentException
{
IllegalArgumentException illegalArgumentException =
new IllegalArgumentException( "must be >= 0" );
if( n < 0 ) {
throw illegalArgumentException ;
} else if( ( n == 0 ) || ( n == 1 ) ) {
return( 1 );
} else (
return( n * factorial( n - 1 ) ) ;
}
优化后代码
Java代码
static public long
factorial( int n ) throws IllegalArgumentException
{
if( n < 0 ) {
throw new IllegalArgumentException( "must be >= 0" );
} else if( ( n == 0 ) || ( n == 1 ) ) {
return( 1 );
} else (
return( n * factorial( n - 1 ) ) ;
}
9. 异常在需要抛出的地方抛出,try catch能整合就整合
Java代码
try {
some.method1(); // Difficult for javac
} catch( method1Exception e ) { // and the JVM runtime
// Handle exception 1 // to optimize this
} // code
try {
some.method2();
} catch( method2Exception e ) {
// Handle exception 2
}
try {
some.method3();
} catch( method3Exception e ) {
// Handle exception 3
}
已下代码 更容易被编译器优化
Java代码
try {
some.method1(); // Easier to optimize
some.method2();
some.method3();
} catch( method1Exception e ) {
// Handle exception 1
} catch( method2Exception e ) {
// Handle exception 2
} catch( method3Exception e ) {
// Handle exception 3
}
10. For循环的优化
Java代码
Replace...
for( int i = 0; i < collection.size(); i++ ) {
...
}
with...
for( int i = 0, n = collection.size(); i < n; i++ ) {
...
}
11. 字符串操作优化
在对字符串实行+操作时,最好用一条语句
Java代码
// Your source code looks like...
String str = "profit = revenue( " + revenue +
") - cost( " + cost + ")";
// 编译方法
Java代码
String str = new StringBuffer( ).append( "profit = revenue( " ).
append( revenue ).append( ") - cost( " ).
append( cost ).append( ")" ).toString( );
在循环中对字符串操作时改用StringBuffer.append()方法
Java代码
String sentence = "";
for( int i = 0; i < wordArray.length; i++ ) {
sentence += wordArray[ i ];
}
优化为
Java代码
StringBuffer buffer = new StringBuffer( 500 );
for( int i = 0; i < wordArray.length; i++ ) {
buffer.append( wordArray[ i ] );
}
String sentence = buffer.toString( );
12. 对象重用(特别对于大对象来说)
Java代码
public
class Point
{
public int x;
public int y;
public Point( )
{
this( 0, 0 );
}
}
优化为:
public class Component
{
private int x;
private int y;
public Point getPosition( )
{
Point rv = new Point( ); // Create a new Point
rv.x = x; // Update its state
rv.y = y;
return rv;
}
}
// Process an array of Component positions...
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( );
// Process position value...
// Note: A Point object is created for *each* iteration
//
of the loop...
}
可再次优化,仅使用一个类对象:)
Java代码
public
class Component
{
private int x;
private int y;
public Point getPosition( Point rv )
{
if( rv == null) rv = new Point( );
rv.x = x; // Update its state
rv.y = y;
return rv;
}
// Create a single point object and reuse it...
Point p = new Point( );
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( p );
// Process position value...
// Note: Only *one* Point object is ever created.
}
13. j2ee相关
a) 尽量不要将大对象放到HttpSession或其他须序列化的对象中,并注意及时清空Session
b) 使用预编译语句prepareStatement代替createStatement
c) 尽可能使用连接池
d) 能使用Cache就使用Cache,具体实现可参考jive(Cache\Cacheable\CacheObject\CacheSizes\DefaultCache\LinkdList\LinkdListNode)或ofbiz(org.ofbiz.core.util. UtilCache.java)
整理了一些影响性能的代码和优化方法,以后希望能陆续补充和优化
1. 如何使用Exception
Exception降低性能。一个异常抛出首先需要创建一个新的对象。Throwable接口中的构造器调用名为fillInStackTrace()的本地方法。这个方法负责巡检栈的整个框架来收集跟踪信息。这样无论何时有异常抛出,它要求虚拟机装载调用栈,因为一个新的对象在中部被创建。
异常应当仅用于有错误发生时,而不要控制流。
2. 不要两次初始化变量
Java通过调用独特的类构造器默认地初始化变量为一个已知的值。所有的对象被设置成null,integers (byte, short, int, long)被设置成0,float和double设置成0.0,Boolean变量设置成false。这对那些扩展自其它类的类尤其重要,这跟使用一个新的关键词创建一个对象时所有一连串的构造器被自动调用一样。
3. 在任何可能的地方让类为Final
标记为final的类不能被扩展。在《核心Java API》中有大量这个技术的例子,诸如java.lang.String。将String类标记为final阻止了开发者创建他们自己实现的长度方法。
更深入点说,如果类是final的,所有类的方法也是final的。Java编译器可能会内联所有的方法(这依赖于编译器的实现)。在我的测试里,我已经看到性能平均增加了50%。
4. 在任何可能的地方使用局部变量
属于方法调用部分的自变量和声明为此调用一部分的临时变量存储在栈中,这比较快。诸如static,实例(instance)变量和新的对象创建在堆中,这比较慢。局部变量的更深入优化依赖于你正在使用的编译器或虚拟机。
5. 停止小聪明
很多开发人员在脑子中编写可复用和灵活的代码,而有时候在他们的程序中就产生额外的开销。曾经或者另外的时候他们编写了类似这样的代码:
public void doSomething(File file) {
FileInputStream fileIn = new FileInputStream(file);
// do something
他够灵活,但是同时他们也产生了更多的开销。这个主意背后做的事情是操纵一个InputStream,而不是一个文件,因此它应该重写如下:
public void doSomething(InputStream inputStream){
// do something
6. 乘法和除法
我有太多的东东适用于摩尔法则——它声明CPU功率每年成倍增长。"摩尔法则"表明每年由开发者所写的差劲的代码数量三倍增加,划去了摩尔法则的任何好处。
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { shiftX = val * 8; myRaise = val * 2; }
如果我们狡猾的利用位移(bit),性能将会六倍增加。这是重写的代码:
for (val = 0; val < 100000; val += 5) { shiftX = val << 3; myRaise = val << 1; }
代替了乘以8,我们使用同等效果的左移3位。每一个移动相当于乘以2,变量myRaise对此做了证明。同样向右移位相当于除以2,当然这会使执行速度加快,但可能会使你的东东以后难于理解;所以这只是个建议
7. 用代码有效处理内存溢出
OutOfMemoryError是由于内存不够后普遍会遇到的问题,下面一段代码能有效判断内存溢出错误,并在内存溢出发生时有效回收内存
通过该方法可以联想到有效管理连接池溢出,道理等同。
Java代码
import java.util.*;
public class DataServer
{
private Hashtable data = new Hashtable();
public Object get (String key)
{
Object obj = data.get (key);
if (obj == null)
{
System.out.print (key + “ ”);
try
{
// simulate getting lots of data
obj = new Double[1000000];
data.put (key, obj);
}
catch (OutOfMemoryError e)
{
System.out.print (“\No Memory! ”);
flushCache();
obj = get (key);// try again
}
}
return (obj);
}
public void flushCache()
{
System.out.println (“Clearing cache”);
data.clear();
}
public static void main (String[] args)
{
DataServer ds = new DataServer();
int count = 0;
while (true) // infinite loop for test
ds.get (“” + count++);
}
}
8. Lazy Loading (Lazy evaluation)在需要装入的时候才装入
Java代码
static public long
factorial( int n ) throws IllegalArgumentException
{
IllegalArgumentException illegalArgumentException =
new IllegalArgumentException( "must be >= 0" );
if( n < 0 ) {
throw illegalArgumentException ;
} else if( ( n == 0 ) || ( n == 1 ) ) {
return( 1 );
} else (
return( n * factorial( n - 1 ) ) ;
}
优化后代码
Java代码
static public long
factorial( int n ) throws IllegalArgumentException
{
if( n < 0 ) {
throw new IllegalArgumentException( "must be >= 0" );
} else if( ( n == 0 ) || ( n == 1 ) ) {
return( 1 );
} else (
return( n * factorial( n - 1 ) ) ;
}
9. 异常在需要抛出的地方抛出,try catch能整合就整合
Java代码
try {
some.method1(); // Difficult for javac
} catch( method1Exception e ) { // and the JVM runtime
// Handle exception 1 // to optimize this
} // code
try {
some.method2();
} catch( method2Exception e ) {
// Handle exception 2
}
try {
some.method3();
} catch( method3Exception e ) {
// Handle exception 3
}
已下代码 更容易被编译器优化
Java代码
try {
some.method1(); // Easier to optimize
some.method2();
some.method3();
} catch( method1Exception e ) {
// Handle exception 1
} catch( method2Exception e ) {
// Handle exception 2
} catch( method3Exception e ) {
// Handle exception 3
}
10. For循环的优化
Java代码
Replace...
for( int i = 0; i < collection.size(); i++ ) {
...
}
with...
for( int i = 0, n = collection.size(); i < n; i++ ) {
...
}
11. 字符串操作优化
在对字符串实行+操作时,最好用一条语句
Java代码
// Your source code looks like...
String str = "profit = revenue( " + revenue +
") - cost( " + cost + ")";
// 编译方法
Java代码
String str = new StringBuffer( ).append( "profit = revenue( " ).
append( revenue ).append( ") - cost( " ).
append( cost ).append( ")" ).toString( );
在循环中对字符串操作时改用StringBuffer.append()方法
Java代码
String sentence = "";
for( int i = 0; i < wordArray.length; i++ ) {
sentence += wordArray[ i ];
}
优化为
Java代码
StringBuffer buffer = new StringBuffer( 500 );
for( int i = 0; i < wordArray.length; i++ ) {
buffer.append( wordArray[ i ] );
}
String sentence = buffer.toString( );
12. 对象重用(特别对于大对象来说)
Java代码
public
class Point
{
public int x;
public int y;
public Point( )
{
this( 0, 0 );
}
}
优化为:
public class Component
{
private int x;
private int y;
public Point getPosition( )
{
Point rv = new Point( ); // Create a new Point
rv.x = x; // Update its state
rv.y = y;
return rv;
}
}
// Process an array of Component positions...
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( );
// Process position value...
// Note: A Point object is created for *each* iteration
//
of the loop...
}
可再次优化,仅使用一个类对象:)
Java代码
public
class Component
{
private int x;
private int y;
public Point getPosition( Point rv )
{
if( rv == null) rv = new Point( );
rv.x = x; // Update its state
rv.y = y;
return rv;
}
// Create a single point object and reuse it...
Point p = new Point( );
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( p );
// Process position value...
// Note: Only *one* Point object is ever created.
}
13. j2ee相关
a) 尽量不要将大对象放到HttpSession或其他须序列化的对象中,并注意及时清空Session
b) 使用预编译语句prepareStatement代替createStatement
c) 尽可能使用连接池
d) 能使用Cache就使用Cache,具体实现可参考jive(Cache\Cacheable\CacheObject\CacheSizes\DefaultCache\LinkdList\LinkdListNode)或ofbiz(org.ofbiz.core.util. UtilCache.java)
发表评论
-
Java中Object类的wait()和notify()方法怎么使用
2013-02-12 18:28 1646http://wenwen.soso.com/z/q1292 ... -
PropertyEditor
2011-09-23 15:08 1089http://read.pudn.com/downloads3 ... -
一个完整的TableViewer实例
2011-09-23 15:04 2248http://tieba.baidu.com/f?kz=168 ... -
JSON与JAVA的数据转换
2011-09-19 17:27 1096http://developer.51cto.com/art/ ... -
String,StringBuffer与StringBuilder的区别??
2010-07-13 09:51 1067http://blog.csdn.net/rmn190/a ... -
获取java线程中信息的两种方法
2010-06-13 11:08 1218http://www.cn-java.com/www1/?ac ... -
Java:模拟Eclipes的控制台
2010-06-09 10:17 1264http://www.cppblog.com/biao/arc ... -
The Final Performance Testing Example
2009-11-05 10:47 917http://www.artima.com/weblogs/v ... -
看JTS源码,感受Java优化编程
2009-09-21 14:30 2547看JTS源码,感受Java优化编程 http://www.bl ... -
发布FetionAPI 中国移动飞信免费发短信API接口
2009-04-19 10:30 2071http://www.cnbeta.com/articles/ ... -
jolt书籍下载大全
2009-03-09 14:43 1484第19届(2009)Annual Jolt Product E ... -
JDBC性能优化
2009-02-05 15:06 1198jdbc程序的性能主要由两个因素决定,一是数据库本身的性质,另 ... -
『Java代码优化』 尽可能地使用stack(栈)变量(方法内部的局部变量)
2009-02-05 15:04 1093http://looxiaohu.iteye.com/blog ... -
各种数据库的JDBC驱动下载及连接字符串URL写法
2009-01-07 16:19 4029各种数据库的JDBC驱动下载及连接字符串URL写法 sun官 ... -
dos下各种常见命令索引
2008-11-19 17:19 1081http://www.huo119.com/study/dos ... -
java保留小数
2008-08-28 17:21 1611http://www.bincn.com/index.php? ...
相关推荐
虽然不是直接的优化工具,但通过ASM,开发者可以实现自定义的代码优化策略。 8. **JOpt Simple**: JOpt Simple是一个轻量级的路线规划库,可以用于优化复杂的调度问题,例如在分布式系统中的任务调度优化。 9. **...
非常实用的java代码优化策略详解,从变量声明、初始化、字符串链接、异常处理、IO、数组等各个方面进行优化,非常有参考价值。
Java代码优化是对程序进行改进的过程,旨在提升程序的运行效率,减少资源的消耗。优化主要关注两个方面:减小代码体积和提高代码执行效率。在Java中,性能问题往往源于编程习惯而非语言本身。以下是一些针对Java代码...
【Java代码优化编程】 在Java编程中,代码优化是一个关键环节,目的是使程序在有限的资源下更高效地运行。优化主要包括两个方面:减小代码体积和提高代码执行效率。以下是一些关于如何提高Java代码效率的具体策略:...
### Java代码优化技巧详解 #### 一、引言 在软件开发过程中,为了提升应用程序的性能,我们需要对Java代码进行优化。这是因为计算机系统的资源(如内存、CPU时间、网络带宽等)是有限的,而优化的目标就是使程序...
Java代码优化是一个持续的过程,它包含了许多细节和技巧,能够帮助开发者编写出更高效、更易于维护的代码。在这44条Java代码优化建议中,我们可以提炼出一些核心的知识点,为Java编程实践提供参考。 首先,关于为...
这篇博客文章“java代码优化”可能涵盖了多种优化策略和技术,虽然具体的内容没有给出,但我们可以根据常规的Java代码优化实践来探讨相关知识点。 1. **变量优化**: - 避免过度使用`null`检查。Java 8引入了...
以上就是关于Java代码重构、优化以及设计优化的一些关键点,这些知识不仅能提升代码质量,还能帮助开发者更好地应对项目中的各种挑战。通过深入学习《重构-改善既有代码的设计》这样的经典书籍,你可以进一步提升...
### Java代码性能优化23种技巧详解 ...在实际开发中,还需要根据具体的应用场景和需求选择合适的优化策略。同时,结合使用现代IDE提供的性能分析工具可以帮助开发者更加精确地定位性能瓶颈,并针对性地采取优化措施。
"Java代码优化方法大全共5页.pdf"可能是一份详细介绍了Java代码优化核心策略的文档。虽然无法在此直接提供文档内容,但基于Java代码优化的常见实践,我可以分享一些广泛使用的优化技术。 1. **算法优化**:选择合适...
《Java代码与架构之完美优化——实战经典》是一本深入探讨Java编程语言和架构优化的书籍,其配套代码集提供了一系列实例,旨在帮助读者更好地理解并应用书中的理论知识。这个压缩包包含的文件名为“03_《Java代码与...
虽然我们无法直接查看压缩包内容,但根据题目要求,我们可以深入探讨一些常见的Java代码优化策略和技术。 首先,Java代码优化通常从以下几个方面入手: 1. **算法优化**:选择合适的数据结构和算法是优化的基础。...
Java代码优化是一个涉及多个方面的综合过程。通过算法优化、选择合适的数据结构、利用并发和多线程、避免不必要的对象创建、优化字符串操作、以及合理管理内存和垃圾收集,可以显著提高Java程序的性能和效率。随着...
以下是一些针对Java代码优化的方法: 1. **使用`final`修饰符**:声明类或方法为`final`可以阻止子类继承或方法被重写。对于`final`方法,Java编译器可能会进行内联优化,从而提高执行效率。 2. **对象重用**:...
### Eclipse 开发性能优化与 Java 代码性能优化 ...需要注意的是,性能优化是一个持续的过程,随着技术的发展和业务需求的变化,优化策略也需要不断调整和完善。希望上述内容能帮助大家更好地进行性能优化工作。
【Java代码与架构之完美优化配套课件】是针对Java开发者设计的一套全面的优化教程,旨在提升开发者的代码质量、性能调优能力和架构设计能力。这套课件以实战经典案例为引导,深入剖析Java编程中的关键问题和优化策略...
### Java代码效率优化详解 #### 一、前言 在软件开发过程中,特别是在Java语言的使用上,代码的效率优化是非常关键的一个环节。高效的代码不仅可以提高应用程序的性能,还可以降低服务器资源的消耗,从而减少成本...
【Java代码优化1】 在Java编程中,代码优化是一个关键环节,它关乎程序的性能、内存管理和可维护性。以下是一些重要的优化策略和技术: 1. **提升Java性能的基本方法**: - **避免在循环条件中计算**:计算应在...