Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET JIT编译器优化_C#_.net - Fatal编程技术网

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()
的实现。