2013-06-12 145 views
2

我很新的C#所以请允许我一些无知:) (我试着四处搜寻,以了解我看到的性能差异的原因,但作为还没有一个明确的答案,所以我认为我会问在这里的见地观众...)streamwriter声明静态与使用声明

基本上,如果我使用的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上的。

以上是否由于使用说明而导致纯粹通过初始化和处置? (如果是这样,C#为了吃这么多CPU而做了什么?) - 鉴于它是一个静态类,我强制使用自动刷新,当然这同样适用于第二个版本,或者它的处理会有不同的行为,因此咀嚼减少CPU时间?

我只能假设我错过了一些明显的东西。所以希望有人能够启发我,因为我认为你应该使用使用陈述作为一种更安全/更便利的处置方式?

+3

的第一个片段打开,每个日志被调用时关闭该文件的显着差异。第二个片段仅在程序执行期间打开一次文件。前者的开销可能会导致你看到的CPU使用率。 –

+1

你是否多次拨打'Log'?如果是这样的话,使用声明就是创建和处置作家'每次'。 –

+0

是的,日志在实际代码中被调用来监视这两个串行通信,并且在程序中发生异常(或者说当发生异常)时提供堆栈跟踪。听起来好像这纯粹是导致疼痛的处置机制。虽然我是否认为在上述代码的变体二中设置Autoflush属性会导致Streamwriter在调用该类的最后刷新数据? – Grabble

回答

0

第二个片段有两个属性: - 它不会重新创建作家,如果您多次致电日志,它可以提供帮助。 - 它不会处理作者,这意味着您正在编写的文本不会刷新到磁盘,而是保存在内存中以备后续刷新!另一方面,您可以在磁盘上写入每个调用以记录第一个片段。

总而言之,这两种效应应该解释你看到:)

+0

另外:第二个保持日志文件锁定的应用程序的持续时间。 –