首页 > 解决方案 > .NET JIT 编译器优化

问题描述

我在整个应用程序中生成了许多此类日志。

_logger.Debug(string.Format(
   "Object value is - {0}", 
    JsonConvert.SerializeObject(someDynamicObject)));

现在在生产中,大部分时间 log​​level 将是错误,因此上面的行不会记录任何内容。问题是是否调用了 string.format 并且正在执行字符串操作,或者 JIT 编译器足够聪明,可以根据日志级别删除整个调用?如果不是,那么很多字符串操作都是无缘无故发生的,也许我们应该以更好的方式优化这些操作。

标签: c#.net

解决方案


问题是是否调用了 string.format 并且正在执行字符串操作

编译器很可能不会对此进行优化。优化这一点需要内联函数。这可能允许抖动重新安排调用以仅在日志级别检查后格式化字符串。但我不希望这样做:

  • 内联方法有各种要求。其中之一可能会阻止内联。
  • 抖动必须知道 string.Format 是纯的,并且没有任何副作用。即,如果省略调用可能会对程序产生任何影响。
  • 它必须被实施,并且具有足够低的性能影响,以使抖动是值得的。

一些日志记录框架具有带有如下签名的方法以避免此问题。

  • Log<T>(string str, T param1)
  • Log(string str, params object[] parameters)
  • Log(Action<string> messageGenerator)

这是一个更完整示例的 nLog 重载列表。

最好不要登录应用程序的紧密循环和其他对性能敏感的部分,如果必须这样做,请特别注意性能。


推荐阅读