.NET JIT 编译器优化

时间:2021-06-11 08:13:15

标签: c# .net

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

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

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

1 个答案:

答案 0 :(得分:1)

<块引用>

问题是是否调用了string.format,是否进行了字符串操作

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

  • There are various requirements for a method to be inlined。其中之一可能会阻止内联。
  • 抖动必须知道 string.Format 是纯的,并且没有任何副作用。即如果省略调用可能会对程序产生任何影响。
  • 必须实施它,并且对抖动的性能影响足够低,才值得。

某些日志记录框架的方法具有如下特征之一以避免此问题。

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

这是一个更完整的例子的 list of overloads for nLog

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