Streamwriter объявлен статическим против использования оператора
Я ОЧЕНЬ новичок в 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);
}
}
}
}
затем, предполагая, что я посылаю большое количество текста через этот класс, я вижу заметный удар по процессору. Однако, если я вместо этого напишу что-то вроде:
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);
}
}
}
Тогда я вижу, что процессор практически не пострадал.
Вышеизложенное влияет на процессор только через инициализацию и удаление, вызванные оператором использования? (Если так, то, что, черт возьми, делает C#, чтобы съесть так много ЦП???) - Учитывая, что это статический класс, и я принудительно запустил автозапуск, несомненно, то же самое относится ко второй версии, или его утилита действует по-другому и, следовательно, жует меньше процессорного времени?
Я могу только предположить, что я упускаю что-то очевидное. Надеюсь, кто-то может меня просветить, так как я "думал", что вы должны использовать оператор использования как более безопасный / более удобный способ избавления?
1 ответ
Второй фрагмент имеет два свойства: - Он не воссоздает средство записи, что может помочь при многократном вызове журнала. - Он не располагает записывающим устройством, что означает, что текст, который вы пишете, еще не записан на диск, а скорее сохранен в памяти для последующей очистки! С другой стороны, вы записываете на диск каждый вызов для записи в первый фрагмент.
В общем, эти два эффекта должны объяснить заметную разницу, которую вы видите:)