У меня есть приложение, которое читает комментарии и абзацы из файла .docx, используя OpenXmlPowerTools
. Это консольное приложение, которое создает файл debug.log во время работы.
Реализован класс регистратора, который сохраняет сообщения в текстовый файл во всех сборках и печатает эти сообщения на консоли для отладочных сборок. Следующий код является частью этого класса логгера:
public static class Logger
{
public enum LogLevel
{
ERROR, WARNING, DEBUG
}
public static void Log(string message, LogLevel level, bool newline)
{
try
{
// the very next line was a hotspot, as shown in the profiler
using (StreamWriter sw = File.AppendText(path))
{
// write the messages to this file
}
}
catch (Exception ex)
{
// handle it
// I know it is bad practice to catch System.Exception, I need to fix this.
}
}
}
В коде эту функцию часто называют так:
private void doSomething(string someParameter)
{
Logger.Log("The parameter is: " + someParameter, Logger.LogLevel.DEBUG, true);
}
Я профилировал производительность этого, и для довольно большой текстовый документ с десятками комментариев, это заняло 1 мин 40 с. Без регистрации это заняло всего несколько секунд. После некоторого исследования кажется, что File.AppendText
очень медленный. NET.
В качестве альтернативы я попытался использовать буфер:
using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8, 65536)
{
// write the messages to the file
}
В отличие от информации в статье, которую я прочитал, где этот подход рекомендовался, производительность, казалось, ухудшилась (принимая более 2 минуты). Почему это? Как я могу улучшить производительность этого?