Я не делал никаких измерений, и я не обязательно согласен с вашими выводами или вашим подходом к этому типу лесозаготовок, но я не позволю этому помешать мне сделать предложение ...
//Use this to hold the information that you want to log.
public class LogRecord
{
private IEnumerable<object> values;
public LogRecord(params object [] data)
{
LogTime = DateTime.Now;
values = data;
}
public DateTime LogTime { get; set; }
public IEnumerable<object> Values
{
get
{
yield return LogTime;
foreach(var v in values) yield return v;
}
}
}
//
private void MyLogic(MyClass LogObj)
{
var record = new LogRecord("Q", LogObj.Var1, LogObj.Var2, LogObj.Var3);
MyLogger.Log(record);
}
class MyLogger
{
public void Log(LogRecord record)
{
//Do a bunch of threading stuff...
string msg = string.Join(",", record.Values);
//Write the message to the stream
}
}
Там все еще есть new
, но этот подход (создание новой записи в журнале для каждого оператора ведения журнала) используется другими популярными средами ведения журнала, такими как log4net, NLog и EnterpriseLibrary.Насколько я знаю, вы не слышите много жалоб на производительность в этих системах.
Я не знаю, лучше это или хуже, чем у вас.Кроме того, я не знаю, решает ли это проблему с производительностью, о которой вы говорили, что видели.С другой стороны, он немного упрощает код, как для создания сообщения регистрации, так и для объединения его в строку для записи в поток.
Если вы чрезвычайно заинтересованы в производительности и если ваша информациярегистрируется тысячу раз в секунду, вы можете посмотреть на реализацию CurrentTimeGetter в NLog.Его целью является оптимизация поиска по времени, учитывая, что время часто не меняется от одного зарегистрированного сообщения к следующему.Вы можете найти его по этой ссылке:
https://github.com/jkowalski/NLog/blob/master/src/NLog/Internal/CurrentTimeGetter.cs
Моя окончательная рекомендация, вероятно, будет заключаться в том, чтобы попытаться использовать существующую структуру ведения журналов, такую как log4net или NLog.В эти дни я лично рекомендовал бы сначала попробовать NLog, поскольку он только что выпустил новую версию.