我在整个应用程序中生成了许多此类日志。
_logger.Debug(string.Format(
"Object value is - {0}",
JsonConvert.SerializeObject(someDynamicObject)));
现在在生产中,大部分时间日志级别都是错误,因此上面的行不会记录任何内容。问题是是否调用了 string.format 并完成了字符串操作,或者 JIT 编译器足够聪明,可以根据日志级别删除整个调用? 如果没有,那么很多字符串操作会无缘无故地发生,我们可能应该以更好的方式优化这些操作。
答案 0 :(得分:1)
问题是是否调用了string.format,是否进行了字符串操作
编译器很可能不会对此进行优化。优化这将需要内联函数。这可能允许抖动重新安排调用以仅在日志级别检查后格式化字符串。但我不希望这样做:
某些日志记录框架的方法具有如下特征之一以避免此问题。
Log<T>(string str, T param1)
Log(string str, params object[] parameters)
Log(Action<string> messageGenerator)
这是一个更完整的例子的 list of overloads for nLog。
建议不要登录应用程序的紧密循环和其他对性能敏感的部分,如果必须这样做,请特别注意性能。