我对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语句作为一种更安全/更方便的处理方式?
答案 0 :(得分:0)
第二个代码段有两个属性: - 它不会重新创建编写器,如果您多次调用日志,它可以提供帮助。 - 它不会处理编写器,这意味着您正在编写的文本尚未刷新到磁盘,而是保留在内存中以便以后刷新!另一方面,每次使用第一个代码段记录时,都会在磁盘上写入。
总而言之,这两种效应应该可以解释你所看到的显着差异:)