`
llfzy
  • 浏览: 15967 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
文章分类
社区版块
存档分类
最新评论

优化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是由于内存不够后普遍会遇到的问题,下面一段代码能有效判断内存溢出错误,并在内存溢出发生时有效回收内存
通过该方法可以联想到有效管理连接池溢出,道理等同。
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)在需要装入的时候才装入
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 ) ) ;
}

优化后代码
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能整合就整合
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
}

已下代码 更容易被编译器优化
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循环的优化
Replace…
for( int i = 0; i < collection.size(); i++ ) {
...
}

with…
for( int i = 0, n = collection.size(); i < n; i++ ) {
...
}

11. 字符串操作优化
在对字符串实行+操作时,最好用一条语句
// Your source code looks like…
String str = “profit = revenue( ” revenue
“ – cost( ” cost ““;

// 编译方法
String str = new StringBuffer( ).append( “profit = revenue( “ ).
append( revenue ).append( “ – cost( “ ).
append( cost ).append( ““ ).toString( );
在循环中对字符串操作时改用StringBuffer.append()方法
String sentence = “”;
for( int i = 0; i < wordArray.length; i++ ) {
sentence += wordArray[ i ];
}

优化为
StringBuffer buffer = new StringBuffer( 500 );
for( int i = 0; i < wordArray.length; i++ ) {
buffer.append( wordArray[ i ] );
}

String sentence = buffer.toString( );
12. 对象重用(特别对于大对象来说)
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…
}

可再次优化,仅使用一个类对象:)
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)

分享到:
评论
3 楼 dk101 2010-07-12  
写得很有深度,看来是经过精心总结的,理论的同时,给出了代码,很有说服力。
2 楼 leijing 2010-06-24  
写的不错,看来LZ很有经验啊!
1 楼 llfzy 2010-06-24  
大家发表下意见撒

相关推荐

    JAVA代码优化工具

    Java代码优化是提升应用程序性能的关键步骤,尤其是在大型企业级应用或者高性能服务中。优化能够减少内存消耗,提高程序运行速度,降低CPU使用率,并改善整体的用户体验。在Java开发领域,有多种工具可以帮助开发者...

    提高 Java 代码的性能

    总的来说,提高Java代码性能的一个策略是关注尾递归的优化,尤其是当递归深度较大时。开发者需要理解其JVM的行为,利用JIT编译器的动态优化能力,同时注意在编写递归代码时确保正确性和效率。此外,还可以通过其他...

    java代码性能优化23种技巧

    ### Java代码性能优化23种技巧详解 #### 一、避免在循环条件中使用复杂表达式 在Java中,尤其是在不进行编译器优化的情况下,循环条件会在每次迭代时都被重新计算。如果循环条件涉及复杂的表达式或者动态计算,这...

    eclipse开发性能优化、java代码性能优化

    ### Eclipse 开发性能优化与 Java 代码性能优化 在日常的软件开发过程中,尤其是在使用 Eclipse 进行 Android 开发时,经常会遇到 IDE 运行缓慢的情况。为了提高开发效率,本文将详细介绍 Eclipse 开发环境及 Java ...

    提高java代码性能各种技巧

    Java 代码性能优化技巧总结 Java 代码性能优化是每个 Java 开发者都需要掌握的重要技能。以下是对 Java 代码性能优化的各种技巧的总结: 字符串池的实现 在 Java 中,字符串池(String Intern Pool)是通过使用...

    JAVA代码性能优化

    java代码性能优化

    java代码优化编程

    总的来说,优化Java代码涉及多个方面,包括设计良好的数据结构、合理使用API、避免不必要的计算、有效地管理内存和资源,以及适当地处理异常。通过这些方法,可以显著提升Java程序的运行效率,使其在有限的资源下...

    java 代码重构优化 Java 代码优化 java设计优化

    以上就是关于Java代码重构、优化以及设计优化的一些关键点,这些知识不仅能提升代码质量,还能帮助开发者更好地应对项目中的各种挑战。通过深入学习《重构-改善既有代码的设计》这样的经典书籍,你可以进一步提升...

    java代码优化简介

    Java代码优化是对程序进行改进的过程,旨在提升程序的运行效率,减少资源的消耗。优化主要关注两个方面:减小代码体积和提高代码执行效率。在Java中,性能问题往往源于编程习惯而非语言本身。以下是一些针对Java代码...

    java代码优化大全

    在软件开发过程中,为了提升应用程序的性能,我们需要对Java代码进行优化。这是因为计算机系统的资源(如内存、CPU时间、网络带宽等)是有限的,而优化的目标就是使程序能够以最小的资源消耗完成既定任务。优化通常...

    高性能java代码优化建议

    "高性能java代码优化建议"这一主题涵盖了众多资深开发者积累的实践经验,旨在帮助开发者编写出更高效、性能更强的代码。以下是一些关键的知识点: 1. **避免过度使用同步**:在多线程环境中,过多的同步可能导致...

    Java程序性能优化

    《Java程序性能优化:让你的Java程序更快、更稳定》共6章,先后从软件设计、软件编码、JVM调优以及程序故障排斥等方面介绍针对Java程序的优化方法。第1章介绍性能的基本概念、定律、系统调优的过程和注意事项。第2章...

    java程序性能优化

    第3章从代码层面介绍如何编写高性能的Java程序。第4章介绍了并行开发和如何通过多线程提高系统性能。第5章立足于JVM虚拟机层面,介绍如何通过设置合理的JVM参数提升Java程序的性能。第6章为工具篇,介绍了获取和监控...

    java性能的优化-如何提高java运行效率

    【Java 性能优化概述】 Java 作为一种跨平台的编程语言,自1990年代中期推出以来,凭借其“一次编写,到处运行”的特性获得了广泛赞誉,但也因其相对于C等语言的性能和运行效率问题受到诟病。尤其是在服务器端应用...

    Java程序性能优化 让你的Java程序更快、更稳定附本书示例代码(清晰版)

    理解这些参数的意义和如何根据应用需求调整,对于优化Java应用性能至关重要。 最后,代码质量和架构设计也对性能有直接影响。遵循SOLID原则,编写可测试和可扩展的代码,使用模块化和面向服务的设计,能够提高代码...

    44条Java代码优化建议

    Java代码优化是一个持续的过程,它包含了许多细节和技巧,能够帮助开发者编写出更高效、更易于维护的代码。在这44条Java代码优化建议中,我们可以提炼出一些核心的知识点,为Java编程实践提供参考。 首先,关于为...

    Java编写的安卓系统优化软件源代码.rar

    《深入解析Java编写的安卓系统优化软件源代码》 在当今移动互联网时代,安卓系统作为全球最广泛使用的智能手机操作系统之一,其性能优化显得尤为重要。Java作为一种跨平台的编程语言,被广泛应用于安卓应用开发,其...

    35个Java代码性能优化总结.pdf

    ### Java代码性能优化总结 Java代码性能优化是一个广泛的领域,涉及多个方面,包括但不限于内存使用、循环效率、算法优化、集合框架使用等。本总结旨在汇总35个常见的Java代码性能优化技巧。 #### 1. 使用final...

Global site tag (gtag.js) - Google Analytics