我如何在C#中使用.NET的StreamWriter获得最佳性能?

时间:2009-08-13 17:39:30

标签: .net performance file-io streamwriter

当我们需要创建大于10 MB的文本文件时,建议采用哪种方法来获得最佳性能?

代码中有多个部分需要将内容写入单个文件。这意味着很多文本行。

选项#1(此逻辑将多次调用):

  1. 创建StreamWriter实例
  2. 写一些行(根据一些商业逻辑)
  3. 关闭StreamWriter实例
  4. 选项#2:

    1. 在程序开始时创建一个StreamWriter
    2. 从代码的不同部分写下所有行。
    3. 当不需要写任何其他内容时,最后关闭StreamWriter。
    4. 选项#3:还有其他吗?

      请记住输出文件可能大于10 MB。

4 个答案:

答案 0 :(得分:15)

打开一个编写器比重复打开和关闭它更有效。但是,如果这是关键数据,则应在每次写入后调用Flush()以确保它到达磁盘。

你的程序是多线程的吗?如果是这样,你可能希望有一个生产者/消费者队列 - 让一个线程获取要从队列中写入的项目并写入它们,然后其他线程可以自由地将项目放在队列中。

你确定你确实遇到了性能问题吗?这些天10MB非常小......在我的上网本上,写入10MB仍然只需要一两秒左右(不,这不是固态驱动器)。

答案 1 :(得分:0)

使用StringBuilder连接文本,只在文件中打开和写入一次。

答案 2 :(得分:0)

在方案1和2中,您必须问自己是否需要同时访问该文件。在这种情况下,在场景2中,StreamWriter不是一个选项,因为它不是同步的。在方案1中,您应该打开每个StreamWriter,使其获得对文件的独占锁定。

假设顺序访问,我永远不会使用方案2.它需要将StreamWriter传递给需要它的每个代码段。谁负责再次关闭作家。这很快就会变得无法维持。

场景1的缺点是您必须在任何需要的地方打开StreamWriter,这也会变得无法维护。此外,现在您必须知道每个代码部分中文件的位置。

我会在StreamWriter周围找一个单独的包装器,这样你就可以在任何你喜欢的地方使用它,而不会在StreamWriter本身上产生很多依赖。

答案 3 :(得分:0)

只需混合两种方法......使用一个缓冲区,只允许您在内存中存储多少内容。一旦超过该大小,您的缓冲区将被写入磁盘并清理。