我很新的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时间?
我只能假设我错过了一些明显的东西。所以希望有人能够启发我,因为我认为你应该使用使用陈述作为一种更安全/更便利的处置方式?
的第一个片段打开,每个日志被调用时关闭该文件的显着差异。第二个片段仅在程序执行期间打开一次文件。前者的开销可能会导致你看到的CPU使用率。 –
你是否多次拨打'Log'?如果是这样的话,使用声明就是创建和处置作家'每次'。 –
是的,日志在实际代码中被调用来监视这两个串行通信,并且在程序中发生异常(或者说当发生异常)时提供堆栈跟踪。听起来好像这纯粹是导致疼痛的处置机制。虽然我是否认为在上述代码的变体二中设置Autoflush属性会导致Streamwriter在调用该类的最后刷新数据? – Grabble