Java - DataOutputStream writeLong\Byte\Double\Int 速度
Java - DataOutputStream writeLong\Byte\Double\Int Speed
我实现了一种使用 DataOutputStream
的 writeX 方法将原始 Java 类型写入二进制输出文件的方法,但我发现相对于之前的实现,性能降低了 60 倍通过 BufferedWriter
.
写入文本文件
我这样创建输出流:
DataOutputStream outFile = new DataOutputStream(new FileOutputStream("fileLoc"));
我用这个方法写入这样的流:
public static void writeFunctionPoint (DataOutputStream outFile, FunctFileSortCriterion functPt) throws IOException
{
outFile.writeLong (functPt.time);
outFile.writeBytes (functPt.dfid);
outFile.writeDouble (functPt.value);
outFile.writeInt (functPt.qualifier);
} // end method writeFunctionPoint
为什么我的新方法比旧方法慢这么多?
您开始使用 BufferedWriter
并切换到无缓冲 OutputStream
。 I/O 缓冲会对性能产生巨大影响,尤其是当您编写大量小片段时。插入一个BufferedOutputStream
:
DataOutputStream outFile = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("fileLoc")));
与现在的情况相比,这应该会让您获得显着的加速。您还可以尝试调整缓冲区大小以稍微调整性能。但是,我不能说这与您最初的基于 BufferedWriter
的实现相比如何;我猜它至少是可比较的,但一般来说性能很难预测。测试必不可少。
我实现了一种使用 DataOutputStream
的 writeX 方法将原始 Java 类型写入二进制输出文件的方法,但我发现相对于之前的实现,性能降低了 60 倍通过 BufferedWriter
.
我这样创建输出流:
DataOutputStream outFile = new DataOutputStream(new FileOutputStream("fileLoc"));
我用这个方法写入这样的流:
public static void writeFunctionPoint (DataOutputStream outFile, FunctFileSortCriterion functPt) throws IOException
{
outFile.writeLong (functPt.time);
outFile.writeBytes (functPt.dfid);
outFile.writeDouble (functPt.value);
outFile.writeInt (functPt.qualifier);
} // end method writeFunctionPoint
为什么我的新方法比旧方法慢这么多?
您开始使用 BufferedWriter
并切换到无缓冲 OutputStream
。 I/O 缓冲会对性能产生巨大影响,尤其是当您编写大量小片段时。插入一个BufferedOutputStream
:
DataOutputStream outFile = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("fileLoc")));
与现在的情况相比,这应该会让您获得显着的加速。您还可以尝试调整缓冲区大小以稍微调整性能。但是,我不能说这与您最初的基于 BufferedWriter
的实现相比如何;我猜它至少是可比较的,但一般来说性能很难预测。测试必不可少。