如您所知,我們在java中有幾個用於將數據寫入流的工具。
在這個示例代碼中,我通過運行時比較了它們。
有人可以解釋它嗎?謝謝。
下面是代碼:PrintWriter vs PrintStream vs OutputStreamWriter timecosts
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寫字節」是錯誤的,因爲它只寫*字符*。你剛剛得到一個隱式字節到整數轉換。此外,在大多數合理的代碼中,一次寫入單個字節或字符是不現實的 - 您可以使用採用'byte []','char []'或'String'的重載。 –
您的時間安排非常可疑。有關如何在Java中編寫正確的基準測試的信息,請參見[本主題](http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java)。 –
@TedHopp隨着所有建議的採取,寫入磁盤上的文件本身就是一個不可預知的過程。如果在* nix上,可以使用'/ dev/null'作爲相對可預測的接收器;在Windows上,天知道什麼。 –