c# - .NET JIT 编译器优化
问题描述
我在整个应用程序中生成了许多此类日志。
_logger.Debug(string.Format(
"Object value is - {0}",
JsonConvert.SerializeObject(someDynamicObject)));
现在在生产中,大部分时间 loglevel 将是错误,因此上面的行不会记录任何内容。问题是是否调用了 string.format 并且正在执行字符串操作,或者 JIT 编译器足够聪明,可以根据日志级别删除整个调用?如果不是,那么很多字符串操作都是无缘无故发生的,也许我们应该以更好的方式优化这些操作。
解决方案
问题是是否调用了 string.format 并且正在执行字符串操作
编译器很可能不会对此进行优化。优化这一点需要内联函数。这可能允许抖动重新安排调用以仅在日志级别检查后格式化字符串。但我不希望这样做:
- 内联方法有各种要求。其中之一可能会阻止内联。
- 抖动必须知道 string.Format 是纯的,并且没有任何副作用。即,如果省略调用可能会对程序产生任何影响。
- 它必须被实施,并且具有足够低的性能影响,以使抖动是值得的。
一些日志记录框架具有带有如下签名的方法以避免此问题。
Log<T>(string str, T param1)
Log(string str, params object[] parameters)
Log(Action<string> messageGenerator)
这是一个更完整示例的 nLog 重载列表。
最好不要登录应用程序的紧密循环和其他对性能敏感的部分,如果必须这样做,请特别注意性能。
推荐阅读
- functional-programming - Java Lambda 函数接口提取到常用方法
- twitter - Headless Chrome 不执行 JS
- python - Python中的排序函数未返回预期结果
- windows - 为什么某些 WCF 命名管道客户端会收到 TimeoutException
- node.js - Discord.js - 如何让机器人通过服务器 ID 打印服务器名称?
- javascript - Ionic 4 Deeplink 插件返回错误路由不匹配
- mysql - MySQL 服务器版本,用于在第 3 行的 '' 附近使用正确的语法
- vb.net - 如何在 VB.Net 的变量中设置特定列中最后一行的值
- batch-file - 将一行文本添加到文件的批处理脚本
- reactjs - React Native:如何将 mobx-persist 添加到现有商店