第一代碼段更快:如何可以在文件多次寫入比單個一個
// code is a private "global variable" for the class
// SourceCodeBuilder is a class that uses StringBuilder()
// basically it is based on String(s), formatted and with many appends depending on the "loc()" calls (see below)
private SourceCodeBuilder code = new SourceCodeBuilder();
[...]
// create "file.txt" and call algorithm
fileOut = new FileWriter("file.txt");
for (int i=0; i<x; i++) {
algorithm();
}
凡算法()是這樣的方法:
private void algorithm() {
for (int i=0; i<y; i++) {
code.loc("some text");
code.loc("other text");
...
}
// after "building" the code value I wrote it on the file
fileOut.write(code.toString());
fileOut.flush();
code.free(); // this call "empties" the code variable (so the next time algorithm() is called it has the code var sets to "" - it frees a lot of memory)
// basically it calls "setLength(0)" method of StringBuilder
}
當我在大型文本文件中執行所有這些操作需要大約4500ms的執行時間和少於60MB的內存。
然後我試着用這個其他的代碼。 第二一段代碼:
private SourceCodeBuilder code = new SourceCodeBuilder();
[...]
// create "file.txt" and call algorithm
fileOut = new FileWriter("file.txt");
for (int i=0; i<x; i++) {
algorithm();
}
fileOut.write(code.toString());
fileOut.flush();
fileOut.close();
如果此時算法()是這樣的方法:
private void algorithm() {
for (int i=0; i<y; i++) {
code.loc("some text");
code.loc("other text");
...
}
}
它需要更多的內存大於250MB(和它的確定,因爲我不調用代碼變量的「free()」方法,所以它是一個「連續」附加在同一個變量上),但是令人驚訝的是它需要超過5300ms才能執行。 這比第一個代碼慢了大約16%,我無法向自己解釋原因。
在第一個代碼中,我會在「file.txt」上多次寫入多個文本塊。在第二個代碼中,我寫了一大段文字,但只有一次,在「file.txt」上,並使用了更多的內存。隨着第二個代碼,我期待更多的內存消耗,但沒有更多的CPU消耗(僅僅因爲有更多的I/O操作)。
結論:即使第一個代碼比第二個執行更多的I/O操作,第一個代碼也比第二個快。爲什麼?我錯過了什麼嗎?
你在這裏的措辭很混亂;目前還不清楚哪個是哪個,你的基準測試哪個更好,等等。 –
我試圖更好地解釋自己......你不瞭解什麼? – HBv6
StringBuilder是否必須在每次達到一定長度時重新分配它? –