自从第一个Java版本开始,很多开发人员一直都在尝试让Java获得最少和C/C++一样的表现。JVM提供商尽他们最大的努力去实现一些新的JIT算法,但是还是有很多需要做的,特别是在我们使用Java的方法上。
例如,在对象文件序列化上就差距很大–尤其在读写内存对象上。我将就这个主题做一些解释和分享。
所有的测试都是在下面这个对象上执行的:
1
public class TestObjectimplements Serializable
{
2
3
private long longVariable;
4
private long[]
longArray;
5
private String
stringObject;
6
private String
secondStringObject;//just
for testing nulls
7
8
/*
getters and setters */
9
}
最标准的java序列化(我们都是从这里学起的)是这样的:
01
public void testWriteBuffered(TestObject
test, String fileName)throwsIOException
{
02
ObjectOutputStream
objectOutputStream =null;
03
try {
04
FileOutputStream
fos =new FileOutputStream(fileName);
05
BufferedOutputStream
bos =new BufferedOutputStream(fos);
06
objectOutputStream
=new ObjectOutputStream(bos);
07
objectOutputStream.writeObject(test);
08
}finally {
09
if (objectOutputStream
!=null)
{
10
objectOutputStream.close();
11
}
12
}
13
}
提升标准序列化速度的最简单方法时使用RandomAccessFile对象:
01
public void testWriteBuffered(TestObject
test, String fileName)throwsIOException
{
02
ObjectOutputStream
objectOutputStream =null;
03
try {
04
RandomAccessFile
raf =new RandomAccessFile(fileName,"rw");
05
FileOutputStream
fos =new FileOutputStream(raf.getFD());
06
objectOutputStream
=new ObjectOutputStream(fos);
07
objectOutputStream.writeObject(test);
08
}finally {
09
if (objectOutputStream
!=null)
{
10
objectOutputStream.close();
11
}
12
}
更高深点的技术是使用Kryo框架,新旧版本的差距是很大的,我做过测试。因为性能比较上并没有体现出特别引人注意的差异,所以我将使用2.x