2

我需要将 HTML 写入文件系统,我想知道将其转换为字节并使用 FileStream 而不是使用 File.WriteAllText() (或类似的文本方法)写入它是否有任何速度提升。

4

3 回答 3

10

您认为 File.WriteAllText 中会发生什么?最后,它将是撞击磁盘的字节。无论如何,该磁盘不太可能成为该链中缓慢的部分。除非写入的数据非常大,否则我不会担心,只使用我觉得最方便的实现。如果你很好地设计了代码,那么以后如果需要更改就不是一件大事了。

于 2009-07-14T10:43:38.200 回答
7

首先编写最易读和可维护的代码。然后在将来如果你有性能问题,寻找瓶颈。

(如果瓶颈结果与将字符串转换为字节数组有关,我会感到非常惊讶。像这样的瓶颈将是你的磁盘写入速度)

不要过早优化

于 2009-07-14T10:53:02.817 回答
2

File.WriteAllText在幕后使用 StreamWriter:

public static void WriteAllText(string path, string contents, Encoding encoding)
{
    using (StreamWriter writer = new StreamWriter(path, false, encoding))
    {
        writer.Write(contents);
    }
}

您已经有一个字符串,因此将其转换为字节数组将毫无意义,因为无论如何这是在StreamWriter.Flush方法中使用其底层Encoder类执行的。Flush 由 using 子句调用的StreamWriter.Dispose方法调用。这是来自 Flush via reflector 的一个片段:

int count = this.encoder.GetBytes(this.charBuffer, 0, this.charPos, this.byteBuffer, 0, flushEncoder);

你可以看到它有一个 charBuffer。这只是一个 char[] 数组,当您执行StreamWriter.Write(string)时它会写入该数组。

简而言之,您已经有了字符串,只需让较短的 File 方法执行级联调用,因为它使您的源代码更具可读性。也不需要将其转换为字节数组,正如我提到的 StreamWriter 为您完成的。

如果您遇到转换问题,请使用 Encoding.Unicode 作为 3 参数重载中的最后一个参数,因为File.WriteAllText(string,string)使用没有 BOM 的 UTF8。

于 2009-07-14T13:31:25.363 回答