C# .NET JIT编译器优化
我在整个应用程序中生成了许多此类日志C# .NET JIT编译器优化,c#,.net,C#,.net,我在整个应用程序中生成了许多此类日志 _logger.Debug(string.Format( "Object value is - {0}", JsonConvert.SerializeObject(someDynamicObject))); 现在,在生产中,大部分时间loglevel都是错误的,所以上面的行不会记录任何内容。问题是是否调用string.format并执行字符串操作,或者JIT编译器是否足够聪明,可以根据日志级别删除整个调用? 如果不是,那
_logger.Debug(string.Format(
"Object value is - {0}",
JsonConvert.SerializeObject(someDynamicObject)));
现在,在生产中,大部分时间loglevel都是错误的,所以上面的行不会记录任何内容。问题是是否调用string.format并执行字符串操作,或者JIT编译器是否足够聪明,可以根据日志级别删除整个调用?
如果不是,那么很多字符串操作都是无缘无故发生的,我们可能应该以更好的方式优化它们
问题是是否调用string.format并执行字符串操作
编译器很可能不会对此进行优化。优化这一点需要内联函数。这可能允许抖动重新安排调用,以便仅在日志级别检查后格式化字符串。但我不希望这样做:
- 。其中一种可能会阻止内联
- 抖动必须知道string.Format是纯的,并且没有任何副作用。i、 e.如果省略呼叫可能会对程序产生任何影响
- 它必须被实现,并且具有足够的低性能影响,抖动才值得
Log(字符串str,T参数1)
Log(字符串str,参数object[]参数)
日志(操作消息生成器)
最好不要登录紧循环和应用程序的其他性能敏感部分,如果必须这样做,请特别注意性能。到底是如何禁用日志记录的?如果是通过设置一些在运行时可能改变的状态,JIT无法优化检查该状态的代码……将对其进行评估(除非
Debug
用[条件(调试)]
或类似的声明)。如果担心性能,可以将Func
传递给Debug()
而不是实际的字符串,并且只有在实际输出消息时才调用委托。这假设您可以更改Debug()
的实现。