【问题标题】:What is quicker, writing text to a file or converting to bytes and writing it to a file?什么更快,将文本写入文件或转换为字节并将其写入文件?
【发布时间】:2009-07-14 10:39:11
【问题描述】:

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

【问题讨论】:

  • 没有帮助,但谢谢。
  • 如果你真的在乎速度,唯一的答案就是试试看。 JITed 语言有很多变量。 JIT 编译器在不同的情况下会做出不同的优化,因此您永远无法真正对性能做出笼统的陈述。不同的技术适用于不同的情况。为了确定哪个更快,您应该在尽可能接近您的实际环境的环境中运行一些测试。

标签: c# text byte


【解决方案1】:

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

【讨论】:

  • 我没有瓶颈,我只是想知道,因为处理器对时间敏感,我们正试图在所有可能的区域进行保存。不过感谢您的回复。
【解决方案2】:

首先编写最具可读性和可维护性的代码。那么以后如果遇到性能问题,就去找瓶颈。

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

Don't optimise prematurely.

【讨论】:

  • +1。首先让它工作,必要时重新设计,然后对其进行微调。
  • 我猜他在问,因为他已经成功了,现在正在重新设计。这个答案也与第一个相矛盾!磁盘写入很昂贵,但内存中的字符串的两个副本对于服务器应用程序来说不是一个好主意
  • @Chris:它与第一个(Fredrik 的?)有何矛盾,我们都说几乎相同的事情,首先是可维护性,而且主要时间成本很可能是磁盘.还是我误读了 Fredricks 的回答?
  • 我的意思是有人说磁盘写入速度很快,而你的却说不是(这通常是最常见的建议)
  • @Chris:啊,Fredrik 说“磁盘不太可能是慢的部分”。我认为这是双重否定的意思是“磁盘可能是缓慢的部分”。我认为这就是他的意思,因为与 CPU 相比,磁盘速度较慢。
【解决方案3】:

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 源的 sn-p 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。

【讨论】:

  • 感谢您实际回答问题。其他所有人,请注意这一点并跟随他的领导。发表与实际问题无关的陈述是没有意义的,只会妨碍您。
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
相关资源
最近更新 更多