【发布时间】:2011-03-22 20:53:59
【问题描述】:
我正在从一个 350KB 大小的文件中反序列化一个对象,这需要相当长的时间。我的计算机科学 TA 告诉我,有一种方法可以将缓冲阅读器与 ObjectInputStream 一起使用,以大大提高性能。但是,我在 Google 上找不到任何相关信息。
【问题讨论】:
标签: java performance serialization buffer
我正在从一个 350KB 大小的文件中反序列化一个对象,这需要相当长的时间。我的计算机科学 TA 告诉我,有一种方法可以将缓冲阅读器与 ObjectInputStream 一起使用,以大大提高性能。但是,我在 Google 上找不到任何相关信息。
【问题讨论】:
标签: java performance serialization buffer
您使用装饰来缓冲输入流。像这样
InputStream in = ...; // your underlying stream (e.g. FileInputStream)
ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in));
这将确保对 ObjectInputStream 的每次调用都不会调用基本流in,例如操作系统的文件读取系统调用。相反,每个调用都转到缓冲的输入流,该流获取并缓存数据块(默认为 8K),并从中读取。这更快,因为从流中读取现在是 java 中的本地方法调用,并且系统调用的方法调用开销很少遇到。缓存一致性和 JIT 优化也在提高性能方面发挥作用。
【讨论】:
ObjectInputStream 至少在部分时间使用 1k 缓冲区,所以这个建议不会像这里建议的那样有戏剧性的效果。
BufferedReader 中的readLine() 方法之类的行?
不,但你可以使用 ObjectInputStream(InputStream in) 构造函数
通过将 BufferedInputStream 作为参数传递给上述构造函数来创建缓冲对象输入流。
这是从文件中读取序列化对象的示例:
InputStream file = null;
try {
file = new FileInputStream("Out.test");
InputStream buffer = new BufferedInputStream(file);
ObjectInputStream in = new ObjectInputStream(buffer);
vector = (Vector)in.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally{
if(file != null ) {
file.close();
}
}
查看以下链接:
http://java.sun.com/docs/books/performance/1st_edition/html/JPIOPerformance.fm.html
【讨论】:
file 声明行之后可能需要一个try {,以及一个} finally { file.close(); } 而不是in.close();。
finally 块中,file 没有被声明。