如何定位Source Generators性能问题
前言
在以前的文章中,我们介绍过如何调试Source Generators。但是当实现较为复杂时,我们需要能够快速地分析Source Generators性能的方法。
默认情况下,使用VS 2019自带的“性能探查器”不能分析Source Generators项目,因为它是类库项目:
如果设置引用Source Generators的目标项目作为启动项目,也不行。因为“性能探查器”只能收集启动时的数据,而不是编译时,而编译时才是Source Generators实际执行的位置。
怎么办?
那就想办法启动编译指令。
获取编译指令
这时就要祭出我们在《你知道MSBuild都干了些什么》使用过的神器——MSBuild Structured Log Viewer。
生成日志后,可以看到MSBuild准备执行的所有目标,每个目标中包含多个任务。
我们浏览所有任务,最终可以定位到引用Source Generators的目标项目执行的Task Csc
:
Csc 任务 - 包装 csc.exe,生成可执行 (.exe) 文件、动态链接库(.dll 文件)或者代码模块(.netmodule 文件) 。有关 csc.exe 的详细信息,请参阅 C# 编译器选项 。
这里的CommandLineArguments就是我们要的编译指令。
设置调试属性
打开Source Generators项目的属性窗口,设置“调试”属性:
启动:可执行文件
可执行文件:
Task Csc
参数CommandLineArguments里的csc.exe全路径应用程序参数:
Task Csc
参数CommandLineArguments里的csc.exe后面的全内容工作目录:引用Source Generators的目标项目所在目录
执行性能探查器
将Source Generators项目设为启动项目,然后运行“性能探查器”,勾选“CPU 使用率”,然后点击“开始”按钮。
运行完成后,在打开的报告中就可以查看Source Generators的性能瓶颈了:
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“
如何定位Source Generators性能问题相关推荐
- 轻松实现深度Clone | Source Generators方式
前言 在开发中,我们经常需要创建某个类型实例的副本. 常用的方式,是继承ICloneable接口,然后自行实现Clone(),这会耗费一定的开发时间:或者使用序列化/反序列化方式变相实现,但是性能不高 ...
- 究竟是什么可以比反射还快实现动态调用?| Source Generators版
前言 最近在公众号上看到一篇文章<究竟是什么可以比反射还快实现动态调用?>,它使用的是Newbe.ObjectVisitor,基于C#表达式树访问一个普通class的所有属性和对应的值,可 ...
- Source Generators实现简版AutoMapper
问题 在业务开发中,我们常常需要将一个对象映射成另一个对象.例如将领域实体(UserEntity)映射成暴露给服务外部使用的数据传输对象(UserDto). 而AutoMapper则是目前主流的解决方 ...
- 在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators
Microsoft在最新的C#版本中引入了Source Generator.这是一项新功能,可以让我们在代码编译时生成源代码.在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作.然后,您 ...
- MySQL高性能实战——part3——分析SQL,定位慢SQL(性能优化的前提)
前言: 此文借鉴<MySQL高性能>一书,还有MySQL官方文档,笔者将通过自身的一些实战经验和阅读习惯对本书进行一个总结,整理,归纳出企业级开发中常用的优化案列和部分概念!! 官方文 ...
- 抽丝剥茧!Source Generators原理讲解
前言 前段时间,我们已经用Source Generators实现了好多功能,比如AutoMapper.API最佳实践. 你看完那些实现代码,是不是还有点云里雾里! Source Generators到 ...
- Hello Blazor:(9)Source Generators生成导航菜单
前言 最近写了多篇关于Source Generators的文章,发现它确实可以简化我们的部分开发工作. 这不,我又盯上了Blazor. 问题 默认的NavMenu.razor组件用于显示导航菜单,它的 ...
- .NET Core开发实战(定义API的最佳实践)Source Generators版
前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...
- Source Generators(源代码生成器)的调试器支持 | Visual Studio 2019(16.10)新功能试用...
开始之前 Source Generators旨在启用编译时间元编程,即可以在编译时间创建并添加到编译中的代码. 首先用一个Demo为不了解Source Generators的朋友演示一下功能.Sour ...
最新文章
- 计算几个数相加和为16
- 思科防火墙nat-control的作用
- DCMTK:将显示曲线导出到文本文件
- 18.12.09-C语言练习:兔子繁衍问题 / Fibonacci 数列
- java 常量变量使用_java常量和变量入门教程
- 实验三《实时系统的移植》 20145222黄亚奇 20145213祁玮
- python中long类型_浅谈python 四种数值类型(int,long,float,complex)
- (计算机组成原理)第三章存储系统:本章习题
- 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
- runtime—新手必学
- mysql _bin编码_mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
- Android常见问题剖析
- c语言变量命名规则_数据的来龙去脉——常量与变量
- win7如何彻底清理c盘?有什么好方法推荐?
- python 异常 exception_关于Python中异常(Exception)的汇总
- 学习java和html必须要知道的英文单词(入门单词,包括C#)
- 使用Python实现淘宝订单定时付款
- 传统企业怎么通过抖音引流到微信
- 第十一课:磁场和洛伦兹力
- C/S模式和B/S模式
热门文章
- 请设计各种管理系统、业务系统的大哥大姐们,设计新系统时,拜托您,请允许我修改用户名、密码...
- 根据当月数据库自动生成下个月数据库--3
- Django 使用 mysql 数据库连接
- python文件打包发布(引用的包也可以加进来),打包出错解决了,运行出错解决了...
- SQL Server 2000详细安装过程及配置
- Quartus prime16.0 与modelsim ae 联调
- #CSS# 初识CSS
- iOS6.0以上版本,关于NSDateFormatter的问题
- 【转】sqlserver游标概念与实例全面解说
- HDU 1856 Brave Game(巴什博奕)