`
nakata_yf
  • 浏览: 112370 次
  • 性别: 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)
分享到:
评论
4 楼 wangyc0521 2010-12-10  
mickey_mjy 写道
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,当然这会使执行速度加快,但可能会使你的东东以后难于理解;所以这只是个建议



这个我实验了一下~貌似你的说法不对,他们的效率前者更高一些!


移位的效率比*的效率要高    这种情况可能是测试环境导致的
3 楼 mickey_mjy 2010-09-09  
前者 运行时间:1284022797078
后者 运行时间:1284022815484


这只是一次运行时间,每次运行时间会有微差
2 楼 mickey_mjy 2010-09-09  
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,当然这会使执行速度加快,但可能会使你的东东以后难于理解;所以这只是个建议



这个我实验了一下~貌似你的说法不对,他们的效率前者更高一些!
1 楼 天空之城 2008-11-27  
很有价值。

相关推荐

    JAVA代码优化实用策略

    非常实用的java代码优化策略详解,从变量声明、初始化、字符串链接、异常处理、IO、数组等各个方面进行优化,非常有参考价值。

    JAVA代码优化工具

    虽然不是直接的优化工具,但通过ASM,开发者可以实现自定义的代码优化策略。 8. **JOpt Simple**: JOpt Simple是一个轻量级的路线规划库,可以用于优化复杂的调度问题,例如在分布式系统中的任务调度优化。 9. **...

    java代码优化编程共11页.pdf.zip

    虽然我们无法直接查看压缩包内容,但根据题目要求,我们可以深入探讨一些常见的Java代码优化策略和技术。 首先,Java代码优化通常从以下几个方面入手: 1. **算法优化**:选择合适的数据结构和算法是优化的基础。...

    java代码优化总结1.0版本.7z

    在这个1.0版本的总结文档中,我们将会探讨一些核心的Java代码优化策略和技术,旨在帮助开发者编写更高效、更易于维护的代码。 首先,了解JVM(Java虚拟机)的工作原理至关重要。JVM通过即时编译(JIT)将字节码转换...

    java代码优化简介

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

    java代码优化大全

    ### Java代码优化技巧详解 #### 一、引言 在软件开发过程中,为了提升应用程序的性能,我们需要对Java代码进行优化。这是因为计算机系统的资源(如内存、CPU时间、网络带宽等)是有限的,而优化的目标就是使程序...

    java代码优化编程

    【Java代码优化编程】 在Java编程中,代码优化是一个关键环节,目的是使程序在有限的资源下更高效地运行。优化主要包括两个方面:减小代码体积和提高代码执行效率。以下是一些关于如何提高Java代码效率的具体策略:...

    JAVA代码优化.pdf

    以下是一些常见的Java代码优化策略: 1. **对象生成与大小调整**: - 避免过度创建对象:生成过多的对象会增加垃圾收集的负担,降低程序性能。例如,使用`String`进行拼接时,应尽量使用`StringBuilder`或`...

    44条Java代码优化建议

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

    JAVA代码优化[归类].pdf

    下面将详细探讨一些常见的Java代码优化策略。 1. **对象的生成与大小调整**: - **减少对象创建**:频繁创建对象会增加内存压力,尤其是当对象生命周期短时,可能导致频繁的垃圾回收。例如,使用`String`时,连续...

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

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

    java代码优化

    这篇博客文章“java代码优化”可能涵盖了多种优化策略和技术,虽然具体的内容没有给出,但我们可以根据常规的Java代码优化实践来探讨相关知识点。 1. **变量优化**: - 避免过度使用`null`检查。Java 8引入了...

    java代码性能优化23种技巧

    ### Java代码性能优化23种技巧详解 ...在实际开发中,还需要根据具体的应用场景和需求选择合适的优化策略。同时,结合使用现代IDE提供的性能分析工具可以帮助开发者更加精确地定位性能瓶颈,并针对性地采取优化措施。

    Java代码优化实践:策略、技巧与代码示例

    Java代码优化是一个涉及多个方面的综合过程。通过算法优化、选择合适的数据结构、利用并发和多线程、避免不必要的对象创建、优化字符串操作、以及合理管理内存和垃圾收集,可以显著提高Java程序的性能和效率。随着...

    Java性能优化的策略研究.pdf

    "Java性能优化策略研究" Java性能优化是一个_critical_问题,因为Java应用程序的性能直接影响到系统的整体性能和用户体验。为了提高Java应用程序的性能,需要从多方面入手,包括Java应用程序的构建、JVM的微调、...

    Java代码优化方法大全共5页.pdf.zip

    "Java代码优化方法大全共5页.pdf"可能是一份详细介绍了Java代码优化核心策略的文档。虽然无法在此直接提供文档内容,但基于Java代码优化的常见实践,我可以分享一些广泛使用的优化技术。 1. **算法优化**:选择合适...

    高性能java代码优化建议

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

Global site tag (gtag.js) - Google Analytics