重复磁盘写入

时间:2013-01-18 09:49:23

标签: java c++ file-io disk

我需要将一个单词列表写入文件,然后将该文件保存在磁盘上。以下两种方式之一是否优于另一种方式?第二个显然使用更多的主内存,但速度有差异吗?

(这只是伪代码)

for i = 0 to i = n:
    word = generateWord();
    FileWriter.println(word);
end loop

String [] listOfWords = new List
for i = 0 to i = n:
    word = generateWord();
    listOfWords.add(word)
end loop
for i = 0 to n:
    FileWriter.println(listOfWords[i]);
end loop

3 个答案:

答案 0 :(得分:2)

您显示的这两种方法在磁盘使用效率方面完全相同。

在考虑磁盘写入速度时,必须始终考虑使用哪种编写器对象。有许多类型的编写器对象,当涉及实际的磁盘写入时,它们中的每一个都可能表现不同。

如果您使用的对象是其中一个写入您告诉它的确切数据的对象,那么您的写作方式效率非常低。您应该考虑切换到另一个编写器(例如BufferedWriter)或在编写之前构建一个更长的字符串。

通常,您应该尝试以符合磁盘块大小的块来编写数据。

答案 1 :(得分:1)

在您的代码和磁盘之间,您有一个类似的堆栈:Java库代码,虚拟机运行时,C运行时库,操作系统文件缓存/虚拟内存子系统,操作系统I / O调度程序,设备驱动程序和物理磁盘固件。

除非分析显示问题,否则尽可能做到最简单。其中一些层已经过调整,可以处理缓冲,批处理和调度顺序写入,因为它们是一个常见的用例。

答案 2 :(得分:0)

FileWriter的角度来看,你在两个例子中都做了同样的事情,所以显然文件I / O没有任何区别。而且,正如你所说,第一个的空间复杂度是O(1),而不是第二个的O(N)。