VS2017中F#类型提供者拖慢智能感知问题咨询
这问题其实很好理解,核心就是大量动态生成的属性给IDE的实时分析带来了巨大压力,具体来说有这几个关键原因:
IntelliSense的实时遍历开销:每次你在代码里输入
.触发成员提示时,Visual Studio的IntelliSense都要遍历这个类型的所有2000个Tag1到Tag2000属性,为每个属性生成对应的提示项(包括名称、类型、访问修饰符等信息)。VS2017的IntelliSense引擎在处理这种量级的成员时,没有足够的性能优化,CPU和内存的瞬时占用会直接飙升,进而导致卡顿。擦除式类型的动态生成特性:擦除式类型提供者不像静态类型那样提前编译好元数据,而是在IDE的设计时动态生成类型信息。也就是说,每次IDE重新分析代码(比如你修改了代码、切换了文件),都要重新调用你的类型提供者逻辑,生成这2000个
ProvidedProperty实例并加载它们的元数据。这个重复生成的过程本身就很耗时,叠加起来直接拖慢了整个IDE的响应速度。内存累积与元数据处理负担:2000个属性的元数据会持续占用IDE的内存,而且擦除式类型的元数据往往不会被高效回收。随着你使用IDE的时间变长,内存占用越来越高,IntelliSense的响应速度自然会越来越慢。
VS2017 Roslyn引擎的局限性:VS2017使用的Roslyn版本在处理动态生成的类型成员时,性能不如后续版本。它对类型提供者的元数据缓存机制不够完善,面对2000个属性这种大规模的动态成员,很容易出现性能瓶颈,这也是这个问题在VS2017中表现更明显的原因之一。
比如你代码里通过循环生成2000个属性的逻辑,每次设计时都要执行一遍这个循环,生成2000个属性实例——这可不是个轻量级的操作,IDE要同步处理这些实例的信息,自然会慢下来。
内容的提问来源于stack exchange,提问作者Franco Tiveron

