`
nlslzf
  • 浏览: 1048936 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java代码优化,策略与方法

    博客分类:
  • java
阅读更多
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)
分享到:
评论

相关推荐

    JAVA代码优化工具

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

    JAVA代码优化实用策略

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

    java代码优化简介

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

    java代码优化编程

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

    java代码优化大全

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

    44条Java代码优化建议

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

    java代码优化

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

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

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

    java代码性能优化23种技巧

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

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

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

    Java代码与架构之完美优化配套代码.rar

    《Java代码与架构之完美优化——实战经典》是一本深入探讨Java编程语言和架构优化的书籍,其配套代码集提供了一系列实例,旨在帮助读者更好地理解并应用书中的理论知识。这个压缩包包含的文件名为“03_《Java代码与...

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

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

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

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

    java代码效率优化方法(推荐)

    以下是一些针对Java代码优化的方法: 1. **使用`final`修饰符**:声明类或方法为`final`可以阻止子类继承或方法被重写。对于`final`方法,Java编译器可能会进行内联优化,从而提高执行效率。 2. **对象重用**:...

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

    ### Eclipse 开发性能优化与 Java 代码性能优化 ...需要注意的是,性能优化是一个持续的过程,随着技术的发展和业务需求的变化,优化策略也需要不断调整和完善。希望上述内容能帮助大家更好地进行性能优化工作。

    Java代码与架构之完美优化配套课件.rar

    【Java代码与架构之完美优化配套课件】是针对Java开发者设计的一套全面的优化教程,旨在提升开发者的代码质量、性能调优能力和架构设计能力。这套课件以实战经典案例为引导,深入剖析Java编程中的关键问题和优化策略...

    java代码效率优化

    ### Java代码效率优化详解 #### 一、前言 在软件开发过程中,特别是在Java语言的使用上,代码的效率优化是非常关键的一个环节。高效的代码不仅可以提高应用程序的性能,还可以降低服务器资源的消耗,从而减少成本...

    Java代码优化1

    【Java代码优化1】 在Java编程中,代码优化是一个关键环节,它关乎程序的性能、内存管理和可维护性。以下是一些重要的优化策略和技术: 1. **提升Java性能的基本方法**: - **避免在循环条件中计算**:计算应在...

Global site tag (gtag.js) - Google Analytics