第一段代码:
// 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();
}
其中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
}
当我在大型文本文件上执行所有这些操作时,执行大约需要 4500 毫秒,并且内存不到 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();
这个 time algorithm()是这样的方法:
private void algorithm () {
for (int i=0; i<y; i++) {
code.loc("some text");
code.loc("other text");
...
}
}
它需要超过 250MB 的内存(这没关系,因为我没有在代码变量上调用“free()”方法,所以它是对同一变量的“连续”附加),但令人惊讶的是它需要超过 5300 毫秒执行。这比第一个代码慢了大约 16%,我无法向自己解释原因。
在第一个代码中,我在“file.txt”上多次写入小段文本。在第二个代码中,我在“file.txt”上写了一大段文本,但只写了一次,并且使用了更多内存。对于第二个代码,我期望更多的内存消耗,但甚至不会消耗更多的 CPU(只是因为有更多的 I/O 操作)。
结论:第一段代码比第二段代码快,即使第一段代码比第二段代码执行更多的 I/O 操作。为什么?我错过了什么吗?