Java性能设计(二)

2014-11-23 21:25:28 · 作者: · 浏览: 17
mponent.getWidth();

两全其美了不是?

这就是减少创建对象技巧之一: 增加finer-grained辅助功能

第二种技巧是:Exploit mutability

上例还有一种实现方式:

public Rectangle getBounds(Rectangle returnVal) {
  returnVal.x = myBounds.x;
  returnVal.y = myBounds.y;
  returnVal.height = myBounds.height;
  returnVal.width = myBounds.width;
  return returnVal;

}

多巧妙,把Rectangle作为参数传进来修改一下再送出去。

技巧3是 融合变和不变于一身。

总结上面一些例子,发现一个规律:临时对象产生是在这种情况下产生的: 不变的要转换成可变的。那么针对这个根本原因我们设计出各取所需的方案。

以下例说明:

Point是不变的,我们继承它,定义一个可变的子类。

public class Point {
  protected int x, y;
  public Point(int x, int y) { this.x = x; this.y = y; }
  public final int getX() { return x; }
  public final int getY() { return y; }
}

public class MutablePoint extends Point {
  public final void setX(int x) { this.x = x; }
  public final void setY(int y) { this.y = y; }
}

这样,可变的需求和不可变的需求各自满足,分别调用。

public class Shape {
  private MutablePoint myLocation;

  //返回可变的
  public Shape(int x, int y) {
    myLocation = new MutablePoint(x, y);
  }

  //返回不变的
  public Point getLocation() { return (Point) myLocation; } }

远程接口

在分布式应用中,性能也是相当重要的,这里介绍如何通过检查class的接口 能简单预知分布式应用中的性能问题。

在分布式应用中,一个在这个系统中运行的对象能够调用另外一个系统的对象的方法,这是通过很多 内部机制来实现将远程对象貌似本地对象的,为了发现远程对象,你首先必须发现它,这是通过一种名称目录服务机制,比如RMO的注册,JNDO和CORBA的名称服务。

当你通过目录服务得到一个远程的对象,你不是得到一个实际的指向,而是一个和远程行为一样的stub对象的 指向, 当你调用stub对象的一个方法时,这个得marshal这个方法参数:也就是转换成byte-stream,这类似于序列化,这个stub对象通过网络将marshal后的参数发送给skeleton对象,后者负责unmarshal这些参数然后 调用真正实际的你要调用的远程方法,然后,这个方法返回一个值给skeleton,再逐个沿着刚才路线返回, 一个简单方法要做这么多工作啊。

很显然,远程方法调用要比本地方法调用来得耗时昂贵。

上面返回情况是是指返回原始型primitive,如果返回的是对象,怎么办?如果这个对象支持 远程调用,它