C# 将文本写入文件或将其转换为字节并写入文件,哪一种更快?

C# 将文本写入文件或将其转换为字节并写入文件,哪一种更快?,c#,text,byte,C#,Text,Byte,我需要将HTML写入文件系统,我想知道将其转换为字节并使用FileStream而不是file.WriteAllText()(或类似的文本方法)写入是否有速度提升。您认为file.WriteAllText中会发生什么?最终,将是字节撞击磁盘。无论如何,磁盘不太可能是这条链中速度较慢的部分。除非编写的数据非常大,否则我不会担心它,只使用我认为最方便的实现。如果你设计的代码很好,那么如果需要的话,以后就不会有太大的改变。首先编写可读性和可维护性最好的代码。然后在将来,如果您有性能问题,请查找瓶颈 (如

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

您认为file.WriteAllText中会发生什么?最终,将是字节撞击磁盘。无论如何,磁盘不太可能是这条链中速度较慢的部分。除非编写的数据非常大,否则我不会担心它,只使用我认为最方便的实现。如果你设计的代码很好,那么如果需要的话,以后就不会有太大的改变。

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

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

.

在幕后使用StreamWriter:

public static void WriteAllText(string path, string contents, Encoding encoding)
{
    using (StreamWriter writer = new StreamWriter(path, false, encoding))
    {
        writer.Write(contents);
    }
}
您已经有了一个字符串,因此将其转换为字节数组将毫无意义,因为这是在方法内部使用其基础类执行的。Flush由using子句调用的方法调用。这是Flush via reflector源代码中的一个片段:

int count = this.encoder.GetBytes(this.charBuffer, 0, this.charPos, this.byteBuffer, 0, flushEncoder);
你可以看到它有一个缓冲区。这只是一个char[]数组,它在执行时写入该数组

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


如果您遇到转换问题,请使用Encoding.Unicode作为3参数重载中的最终参数,就像使用不带BOM的UTF8一样。

我没有瓶颈,我只是想知道,由于处理器对时间敏感,我们正试图在所有可能的区域进行保存。谢谢你的回复。一点帮助都没有,但是谢谢。如果你真的关心速度,唯一的答案就是试试看。对于JIT语言,有太多的变量。JIT编译器在不同的环境下进行不同的优化,因此您永远无法真正对性能做出全面的说明。不同的技术适用于不同的情况。为了确定哪一个更快,您应该在尽可能靠近您的实时环境的环境中运行一些测试。首先让它工作,必要时重新设计,然后再对它进行微调。我猜他是在问,因为他已经让它工作了,现在正在重新设计。这个答案也与第一个相矛盾!磁盘写入成本很高,但对于服务器来说,在内存中复制两个字符串也不是一个好主意application@Chris:它与第一个(Fredrik的?)有何矛盾?我们都说,基本上相同的事情是首先考虑可维护性,而且最主要的时间成本很可能是磁盘。还是我误读了弗雷德里克的答案?我的意思是有人说磁盘写入速度快,你的说不是(这通常是最常见的建议)@Chris:ah,弗雷德里克说“磁盘不太可能是慢的部分”。我认为这是双重否定,意思是“磁盘很可能是慢的部分”。我想这就是他的意思,因为与CPU相比,磁盘速度慢。谢谢你回答这个问题。其他人,注意这一点,跟随他的领导。做出与实际问题无关的陈述是毫无意义的,而且只是一种阻碍。