【发布时间】:2013-08-28 04:17:47
【问题描述】:
如您所知,我们在 java 中有多种工具可以将数据写入流。
在此示例代码中,我按运行时对它们进行了比较。
有人可以准确地解释一下吗?谢谢。
这是代码:
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
public class IOtests
{
public static void main(String[] args) throws Exception
{
char[] chars = new char[100];
byte[] bytes = new byte[100];
for (int i = 0; i < 100; i++)
{
chars[i] = (char) i;
bytes[i] = (byte) i;
}
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(
"output.txt"));
long a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (char j : chars)
out.write(j);
System.out.println("OutputStreamWriter writing characters: "
+ (System.currentTimeMillis() - a));
out = new OutputStreamWriter(new FileOutputStream("output.txt"));
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (byte j : bytes)
out.write(j);
System.out.println("OutputStreamWriter writing bytes: "
+ (System.currentTimeMillis() - a));
PrintStream out1 = new PrintStream("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (char j : chars)
out1.write(j);
System.out.println("PrintStream writing characters: "
+ (System.currentTimeMillis() - a));
out1 = new PrintStream("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (byte j : bytes)
out1.write(j);
System.out.println("PrintStream writing bytes: "
+ (System.currentTimeMillis() - a));
PrintWriter out2 = new PrintWriter("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (char j : chars)
out2.write(j);
System.out.println("PrintWriter writing characters: "
+ (System.currentTimeMillis() - a));
out1 = new PrintStream("output.txt");
a = System.currentTimeMillis();
for (int i = 0; i < 100000; i++)
for (byte j : bytes)
out2.write(j);
System.out.println("PrintWriter writing bytes: "
+ (System.currentTimeMillis() - a));
}
}
结果:
OutputStreamWriter 写入字符:4141
OutputStreamWriter 写入字节数:3546
PrintStream 写入字符:86516
PrintStream 写入字节数:70484
PrintWriter 书写字符:938
PrintWriter 写入字节数:2484
请注意,所有时间都以毫秒为单位。
【问题讨论】:
-
鉴于您从不关闭输出,它可以全部被缓冲。此外,您没有进行任何 JIT 预热,也没有执行任何垃圾收集等。哦,“PrintWriter 写入字节”是用词不当,因为它只写入 字符。您刚刚获得了隐式字节到 int 的转换。此外,在大多数明智的代码中一次写入单个字节或字符是不现实的——你会使用采用
byte[]、char[]或String的重载。 -
您的计时数字非常可疑。有关如何在 Java 中编写正确基准的信息,请参阅 this thread。
-
@TedHopp 考虑到所有这些建议,写入磁盘上的文件本身就是一个不可预测的过程。如果在 *nix 上,可以使用
/dev/null作为相对可预测的接收器;在 Windows 上,天知道是什么。 -
回答 cmets。我在其上运行代码的系统非常旧,这就是数量众多的原因。而且我只是想比较,不想对精确的基准测试如此技术化。在您的系统上运行此代码。运行几次后,您会看到比例几乎相同。
-
@MarkoTopolnik - 是的。 OP 可以使用内存中的输出接收器,或者(更好)来自 Apache Commons 的
NullOutputStream。