streamwriter使用using语句声明静态vs

时间:2013-06-12 15:46:57

标签: c# .net static using streamwriter

我对C#非常陌生,所以请允许我一些无知:) (我已经尝试过去了解我所看到的表现差异的原因,但至今还没有明确的答案,所以我想我会问这些知识渊博的观众......)

基本上......如果我使用像这样的输出法:

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上的任何打击。

以上是否仅仅通过使用声明引起的虚拟化处理CPU? (如果是这样的话,C#吃掉这么多CPU到底是怎么回事?) - 鉴于它是一个静态的类而且我已经强迫autoflush,当然这同样适用于第二个版本,或者它的处理是否采取不同的行为因此咀嚼减少CPU时间?

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

1 个答案:

答案 0 :(得分:0)

第二个代码段有两个属性: - 它不会重新创建编写器,如果您多次调用日志,它可以提供帮助。 - 它不会处理编写器,这意味着您正在编写的文本尚未刷新到磁盘,而是保留在内存中以便以后刷新!另一方面,每次使用第一个代码段记录时,都会在磁盘上写入。

总而言之,这两种效应应该可以解释你所看到的显着差异:)