什么是更快,将文本写入文件或转换为字节并将其写入文件?

时间:2009-07-14 10:39:12

标签: c# text byte

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

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

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

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

Don't optimise prematurely

答案 2 :(得分: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通过反射器的源代码片段:

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)使用UTF8而没有BOM。