2

我对 C# 很陌生,所以请允许我有些无知:) (我试图四处寻找以了解我所看到的性能差异的原因,但到目前为止还没有明确的答案,所以我想我会问这里的知识渊博的观众......)

基本上......如果我使用streamwriter类似:

public static class Logging
{
  readonly static object DebugWriter = new object();

  public static void Log(string msg)
  {
    lock (DebugWriter)
    {
      using (StreamWriter writer = new StreamWriter("Debug.txt", true))
      {
        writer.WriteLine(DateTime.UtcNow.ToString("HH:mm:ss.ffff") + " " + msg);
      }
    }
  }
}

然后假设我通过这个类发送大量文本,我会看到 CPU 受到明显影响。但是,如果我改为按照以下方式编写它:

public static class Logging
{
  readonly static object DebugWriter = new object();
  static StreamWriter lwriter = new StreamWriter("LocalDrivenDebug.txt", true) { AutoFlush = true };

  public static void Log(string msg)
  {
    lock (DebugWriter)
    {
        lwriter.WriteLine(DateTime.UtcNow.ToString("HH:mm:ss.ffff") + " " + msg);
    }
  }
}

然后我几乎看不到 CPU 受到任何影响。

上述是否完全通过 using 语句引起的初始化和处置来鞭打 CPU?(如果是这样的话,C# 到底在做什么来吃这么多 CPU ???) - 鉴于它是一个静态类并且我已经强制自动刷新,当然这同样适用于第二个版本,或者它的处理方式会有所不同,因此咀嚼占用更少的 CPU 时间?

我只能假设我遗漏了一些明显的东西。所以希望有人能启发我,因为我“认为”你应该使用 using 语句作为更安全/更方便的处理方式?

4

1 回答 1

0

第二个片段有两个属性: - 它不会重新创建编写器,如果您多次调用 log 会有所帮助。- 它不会释放作者,这意味着您正在编写的文本尚未刷新到磁盘,而是保存在内存中以供以后刷新!另一方面,您在磁盘上写入每个调用以记录第一个片段。

总而言之,这两种效果应该可以解释您看到的明显差异:)

于 2013-06-12T16:19:39.263 回答