提高J2SE性能的代码技巧(下)


        www.InnovateDigital.com 整理

 

1.格式化


      ■ 文本格式化类:

         一 java.text.DateFaormat

         一 java.text.NumberFaormat

         一 java.text.MessageFaormat

           可能非常慢

      ■ 例如:第一次调用DateFormat.geInstance()创建超过12000个对象

      ■ 每次调用DateFormat.format创建13个对象,加上第一次调用时的那次

         一 重用同一个DateFormat实例而不是重复调用DateFormat.getInstance是很值得做的

      ■ 其它的格式化类有相似的特点

 

2.XML处理:SAX


      ■ 处理XML文档的低级,事件驱动库

      ■ 最好的选择,如果:

         一 你需要以线性的方式遍历整个文档

         一 你只需要查看几项

         一 内存效率是一个问题

 

3.XML处理


      ■ 试着在你的应用程序里消除处理特定XML对象

      ■ 通过一个RMI调用传递DOM树,结果会使整个java对象树序列化。。。通常会4倍甚至更多的空间

 

4.Buffered I/O


      ■ I/O类默认不缓冲

      ■ 为你的I/O流使用缓冲的包装器

           BufferedOutputStream

           BufferedInputStream

           BufferedReader

           BufferedWriter

      ■ 尝试在构造方法中使用缓冲大小参数

         一 BufferedInputStream:默认2048个字节(JDK1.4.1)

         一 BufferedReader:默认8192个字符(JDK1.4.1)

 

5.流与Readers


      ■ 在java里有两个并行的I/O接口

        Reader和Writer

           一 BufferedInputStream:字符序列(16-bit)

        InputStream和OutputStream

           一 字节序列(8-bit)

      ■ 处理基于文本的文件,Readers&Writers更快

        更快的幅度达50%

        参考O'Reilly的"java Performance Tuning"第八章

 

6.新I/O


      ■ 在JDK1.4或更高版本,java.nio包给出了更多I/O选项

         一 正则表达式匹配

         一 内存映射缓存

         一 非中断I/O

      ■ 这些能提供更高的I/O性能


 

7.序列化


      ■ 使一个对象"变平"允许使它流化成一个文件(为了存储)或者网络连接(为了传输)

         一 添加Serializeable接口标记你的类

         一 通过ObjectInputStream/ObjectOutputStream

      ■ 序列化被远程方法调用广泛使用

 

      ■ 序列化可能会非常昂贵

         一 当你序列化一个对象时,这个对象可达的每个对象都会被序列化,可能会有非常多的对象

         一 除了内部虚拟机程序,还会大量使用反射

         一 序列化是非常繁冗的

             只有一个int数据的类占用37个字节

             序列化的对象包括了每个类成员及其值的全限定名

         一 速度是不对称的,反序列化比序列化速度更慢

 

8.序列化:transient关键字


      ■ 可以重新定义序列化动作

         一 使用transient关键字指出不需要在序列化流中包含的成员变量

             Private transient String name;

         一 这让你可以指出对象里不重要的成员变量或者当对象读入内存时可以重新计算的成员变量

 

9.序列化:Externalizable接口


      ■ 消除序列化负载,实现Externalizable接口而不是Serializable

            Public void readExternal(ObjectInput out)

             Public void writerExternal(ObjectOutput out)

      ■ 程序员完全要负责:

         一 管理序列化内容

         一 调用readExternal()/wirteExternal()方法序列化对象

 

10.Externalizable


Java performance