java

位置:IT落伍者 >> java >> 浏览文章

Java程序性能优化(1)


发布日期:2018年08月11日
 
Java程序性能优化(1)

避免在循环条件中使用复杂表达式

在不做编译优化的情况下在循环中循环条件会被反复计算如果不使用复杂表达式而使循环条件值不变的话程序将会运行的更快

例子

import javautilVector;

class CEL {

void method (Vector vector) {

for (int i = ; i < vectorsize (); i++) // Violation

; //

}

}

更正

class CEL_fixed {

void method (Vector vector) {

int size = vectorsize ()

for (int i = ; i < size; i++)

; //

}

}

VectorsHashtables定义初始大小

JVM为Vector扩充大小的时候需要重新创建一个更大的数组将原原先数组中的内容复制过来最后原先的数组再被回收可见Vector容量的扩大是一个颇费时间的事

通常默认的个元素大小是不够的你最好能准确的估计你所需要的最佳大小

例子

import javautilVector;

public class DIC {

public void addObjects (Object[] o) {

// if length > Vector needs to expand

for (int i = ; i< olength;i++) {

vadd(o); // capacity before it can add more elements

}

}

public Vector v = new Vector(); // no initialCapacity

}

更正

自己设定初始大小

public Vector v = new Vector();

public Hashtable hash = new Hashtable();

参考资料

Dov Bulka Java Performance and Scalability Volume : ServerSide Programming

Techniques Addison Wesley ISBN: pp

在finally块中关闭Stream

程序中使用到的资源应当被释放以避免资源洩漏这最好在finally块中去做不管程序执行的结果如何finally块总是会执行的以确保资源的正确关闭

例子

import javaio*;

public class CS {

public static void main (String args[]) {

CS cs = new CS ();

thod ();

}

public void method () {

try {

FileInputStream fis = new FileInputStream (CSjava);

int count = ;

while (fisread () != )

count++;

Systemoutprintln (count);

fisclose ();

} catch (FileNotFoundException e) {

} catch (IOException e) {

}

}

}

更正

在最后一个catch后添加一个finally块

参考资料

Peter Haggar: Practical Java Programming Language Guide

Addison Wesley pp

使用Systemarraycopy ()代替通过来循环复制数组

Systemarraycopy () 要比通过循环来复制数组快的多

例子

public class IRB

{

void method () {

int[] array = new int [];

for (int i = ; i < arraylength; i++) {

array [i] = i;

}

int[] array = new int [];

for (int i = ; i < arraylength; i++) {

array [i] = array [i]; // Violation

}

}

}

更正

public class IRB

{

void method () {

int[] array = new int [];

for (int i = ; i < arraylength; i++) {

array [i] = i;

}

int[] array = new int [];

Systemarraycopy(array array );

}

}

参考资料

让访问实例内变量的getter/setter方法变成final

简单的getter/setter方法应该被置成final这会告诉编译器这个方法不会被重载所以可以变成inlined

例子

class MAF {

public void setSize (int size) {

_size = size;

}

private int _size;

}

更正

class DAF_fixed {

final public void setSize (int size) {

_size = size;

}

private int _size;

}

参考资料

Warren N and Bishop P () Java in Practice p

AddisonWesley ISBN

避免不需要的instanceof操作

如果左边的对象的静态类型等于右边的instanceof表达式返回永远为true

例子

public class UISO {

public UISO () {}

}

class Dog extends UISO {

void method (Dog dog UISO u) {

Dog d = dog;

if (d instanceof UISO) // always true

Systemoutprintln(Dog is a UISO);

UISO uiso = u;

if (uiso instanceof Object) // always true

Systemoutprintln(uiso is an Object);

}

}

更正

删掉不需要的instanceof操作

class Dog extends UISO {

void method () {

Dog d;

Systemoutprintln (Dog is an UISO);

Systemoutprintln (UISO is an UISO);

}

}

避免不需要的造型操作

所有的类都是直接或者间接继承自Object同样所有的子类也都隐含的等于其父类那么由子类造型至父类的操作就是不必要的了

例子

class UNC {

String _id = UNC;

}

class Dog extends UNC {

void method () {

Dog dog = new Dog ();

UNC animal = (UNC)dog; // not necessary

Object o = (Object)dog; // not necessary

}

}

更正

class Dog extends UNC {

void method () {

Dog dog = new Dog();

UNC animal = dog;

Object o = dog;

}

}

参考资料

Nigel Warren Philip Bishop: Java in Practice Design Styles and Idioms

for Effective Java AddisonWesley pp

               

上一篇:Java根据文件头获取文件类型

下一篇:java日期计算简析