Visual Studio 2022上的F#非常缓慢

5

这仅适用于Visual Studio 2022。我已卸载了VS2019和Preview,但在那里F#工作得非常好(F# 5.0)。我正在使用VS2022来使用F# 6.0,不想回到F# 5.0。

该问题只针对F#。我也使用C#,最新版本的C#在VS2022下运行没有问题。

几乎一直有DevEnv进程在运行,消耗1到4个CPU的4个超线程之一。我已关闭F#设置中所有实验性选项。

有时会有2个或更多的后台进程在运行,有时暂停,有时没有 - 看起来这与后台CPU消耗之间没有任何相关性

有时我会弹出一个关于等待完成编辑器进程或编译进程的对话框。

当devenev.exe消耗CPU周期时,在属性下我看到总是有一个clr.dllCoUnInitializeEE+0x6790是罪魁祸首。我认为这应该是一个短暂的过程?有时候会有两三个占用大部分超线程(其他相同但CPU消耗非常低或没有)。罪魁祸首线程的堆栈如下:

1, Microsoft.FSharp.Collections.SeqModule+Zip@633[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].Invoke(System.__Canon, System.__Canon) + 0x50 <-- FSharp.Core.ni.dll+0x83f430
2, Microsoft.FSharp.Collections.Internal+IEnumerator+map2@103[[System.__Canon, mscorlib],[System.__Canon, mscorlib],[System.__Canon, mscorlib]].DoMoveNext(System.__Canon ByRef) + 0xca <-- FSharp.Core.ni.dll+0x8476ba
3, Microsoft.FSharp.Collections.Internal+IEnumerator+MapEnumerator`1[[System.__Canon, mscorlib]].System.Collections.IEnumerator.MoveNext() + 0x40 <-- FSharp.Core.ni.dll+0x847270
4, Microsoft.FSharp.Collections.SeqModule.ForAll[[System.__Canon, mscorlib]](Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,Boolean>, System.Collections.Generic.IEnumerable`1<System.__Canon>) + 0x76 <-- FSharp.Core.ni.dll+0x753466
5, FSharp.Compiler.Symbols.SymbolHelpers+ItemDisplayPartialEquality@485.System.Collections.Generic.IEqualityComparer<FSharp.Compiler.NameResolution.Item>.Equals(Item, Item) + 0x24 <-- FSharp.Compiler.Service.ni.dll+0x2900294
6, System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].Insert(System.__Canon, System.__Canon, Boolean) + 0x200 <-- mscorlib.ni.dll+0x57bea0
7, Internal.Utilities.Library.IPartialEqualityComparer+partialDistinctBy@1001[[System.__Canon, mscorlib]].Invoke(System.__Canon) + 0xb0 <-- FSharp.Compiler.Service.ni.dll+0x2bc9540
8, Microsoft.FSharp.Primitives.Basics.List.filterToFreshConsTail[[System.__Canon, mscorlib]](Microsoft.FSharp.Collections.FSharpList`1<System.__Canon>, Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,Boolean>, Microsoft.FSharp.Collections.FSharpList`1<System.__Canon>) + 0x4e <-- FSharp.Core.ni.dll+0x76060e
9, Microsoft.FSharp.Primitives.Basics.List.filter[[System.__Canon, mscorlib]](Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,Boolean>, Microsoft.FSharp.Collections.FSharpList`1<System.__Canon>) + 0xe7 <-- FSharp.Core.ni.dll+0x760747
10, FSharp.Compiler.EditorServices.DeclarationListInfo.Create(InfoReader, AccessorDomain, FSharp.Compiler.Text.Range, DisplayEnv, Microsoft.FSharp.Core.FSharpFunc`2<Item,FSharp.Compiler.Symbols.FSharpAccessibility>, Microsoft.FSharp.Collections.FSharpList`1<FSharp.Compiler.EditorServices.CompletionItem>, Microsoft.FSharp.Core.FSharpOption`1<System.String[]>, Boolean) + 0x2a0 <-- FSharp.Compiler.Service.ni.dll+0x274a830
11, <StartupCode$FSharp-Compiler-Service>.$FSharpCheckerResults+GetDeclarations@1088.Invoke(Microsoft.FSharp.Core.Unit) + 0x2a0 <-- FSharp.Compiler.Service.ni.dll+0x289c0b0
12, FSharp.Compiler.Diagnostics.ErrorScope.Protect[[System.__Canon, mscorlib]](FSharp.Compiler.Text.Range, Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,System.__Canon>, Microsoft.FSharp.Core.FSharpFunc`2<System.String,System.__Canon>) + 0x58 <-- FSharp.Compiler.Service.ni.dll+0x24a7d28
13, FSharp.Compiler.CodeAnalysis.TypeCheckInfo.GetDeclarations(Microsoft.FSharp.Core.FSharpOption`1<FSharp.Compiler.CodeAnalysis.FSharpParseFileResults>, Int32, System.String, FSharp.Compiler.EditorServices.PartialLongName, Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Collections.FSharpList`1<FSharp.Compiler.EditorServices.AssemblySymbol>>) + 0x101 <-- FSharp.Compiler.Service.ni.dll+0x27b3831
14, <StartupCode$FSharp-Compiler-Service>.$FSharpCheckerResults+GetDeclarationListInfo@1953-1.Invoke(FSharp.Compiler.CodeAnalysis.TypeCheckInfo) + 0x31 <-- FSharp.Compiler.Service.ni.dll+0x28a33d1
15, <StartupCode$FSharp-Editor>.$CompletionProvider+ProvideCompletionsAsyncAux@110-6.Invoke(Microsoft.CodeAnalysis.Text.SourceText) + 0x143 <-- 0x7ffdb4beacd3
16, Microsoft.FSharp.Control.AsyncPrimitives.CallThenInvokeNoHijackCheck[[System.__Canon, mscorlib],[System.__Canon, mscorlib]](Microsoft.FSharp.Control.AsyncActivation`1<System.__Canon>, System.__Canon, Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,Microsoft.FSharp.Control.FSharpAsync`1<System.__Canon>>) + 0x3e <-- FSharp.Core.ni.dll+0x7c756e
17, clr.dll+0x42b6
18, Microsoft.FSharp.Control.Trampoline.Execute(Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Control.AsyncReturn>) + 0x60 <-- FSharp.Core.ni.dll+0x7c5420
19, <StartupCode$FSharp-Core>.$Async+AwaitWaitHandle@1661-3.Invoke(System.Object, Boolean) + 0xc5 <-- FSharp.Core.ni.dll+0x824265
20, System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) + 0x172 <-- mscorlib.ni.dll+0x58df12
21, System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) + 0x15 <-- mscorlib.ni.dll+0x58dd95
22, System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object, Boolean) + 0xed <-- mscorlib.ni.dll+0xf3676d
23, clr.dll!CoUninitializeEE+0x1b73
24, clr.dll!CoUninitializeEE+0x1a88
25, clr.dll!DllRegisterServerInternal+0x19f43
26, clr.dll!TranslateSecurityAttributes+0x298b3
27, clr.dll!CoUninitializeEE+0x2f30
28, clr.dll!CoUninitializeEE+0x2ea3
29, clr.dll!CoUninitializeEE+0x2de2
30, clr.dll!CoUninitializeEE+0x2fc7
31, clr.dll!TranslateSecurityAttributes+0x296ff
32, clr.dll!ReOpenMetaDataWithMemoryEx+0x1252
33, clr.dll!ReOpenMetaDataWithMemoryEx+0x4090
34, clr.dll!GetMetaDataPublicInterfaceFromInternal+0x1bde5
35, clr.dll!CoUninitializeEE+0x6815
36, kernel32.dll!BaseThreadInitThunk+0x14
37, ntdll.dll!RtlUserThreadStart+0x21

我重新安装了VS2022,只用于Windows C#和F#项目,没有其他的。

希望这足以提供关于正在发生的事情的线索。

更新

请参见我的进一步整理的评论,并获取我认为需要的Framework 4.6和4.7 dot net dlls/runtimes,只有一个dot net core,我认为是6.0,但列为Microsoft .NET Core SDK - 2.1.202(x64) - 如果这是问题的话。

问题似乎仍然是CoUninitialize,它应该是一个短暂的线程来卸载COM对象-请参见https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-couninitializeF#中使用哪个Com对象无法卸载,因为在编辑/编译C#项目时不会发生这种情况?

更新2

我再次安装了最小限度的dot net库的VS2022,我IRC需要4.6和4.7 Framework才能安装一些C#和F#。现在,一切都恢复正常,而我什么也没做,包括没有自动更新等。以下是dotnet --info的最新转储:

PS ..> dotnet --info
.NET SDK (reflecting any global.json):
 Version:   6.0.100
 Commit:    9e8b04bbff

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.18363
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\6.0.100\

Host (useful for support):
  Version: 6.0.0
  Commit:  4822e3c3aa

.NET SDKs installed:
  2.1.202 [C:\Program Files\dotnet\sdk]
  3.1.413 [C:\Program Files\dotnet\sdk]
  5.0.302 [C:\Program Files\dotnet\sdk]
  5.0.403 [C:\Program Files\dotnet\sdk]
  6.0.100 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.All 2.1.28 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.1.30 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.28 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.29 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.1.30 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.18 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.19 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 3.1.21 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.4 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.8 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.9 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.10 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.28 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.29 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.30 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.18 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.19 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 3.1.21 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.4 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.8 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 3.1.17 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.18 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 3.1.19 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.1 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.4 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.8 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.9 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 5.0.12 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]
  Microsoft.WindowsDesktop.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

再次使用 dotnet-core-uninstall 后,一些 SDKs/运行时神奇地重新出现。 这是当前输出:

    PS C:\WINDOWS\system32> dotnet-core-uninstall list

This tool cannot uninstall versions of the runtime or SDK that are 
    - SDKs installed using Visual Studio 2019 Update 3 or later.
    - SDKs and runtimes installed via zip/scripts.
    - Runtimes installed with SDKs (these should be removed by removing that SDK).
The versions that can be uninstalled with this tool are:

.NET Core SDKs:
  5.0.403  x64    [Used by Visual Studio. Specify individually or use --force to remove]
  2.1.202  x64    [Used by Visual Studio. Specify individually or use --force to remove]

.NET Core Runtimes:

ASP.NET Core Runtimes:
  5.0.12  x86
  5.0.10  x64
  3.1.21  x64
  2.1.30  x64

.NET Core Runtime & Hosting Bundles:

没有安装任何扩展。最小化安装。与其他机器没有共享任何内容。 - Martin Freedman
1
也许你的防病毒软件过于激进。可以查看其日志。也许你可以暂时关闭它,以查看发生了什么。也许可以排除解决方案文件夹中的防病毒搜索,因为防病毒软件通常不喜欢在那里进行操作。 - Bent Tranberg
1
又是一次无从下手的尝试:你是否安装了旧版的.NET SDK或运行时(.NET Core 3.x、.NET 5、x86或x64),并且它们在路径中排在.NET 6之前?我曾经遇到过一个旧版的.NET Core 3.1 x86,虽然它引起的问题不是这种类型的问题。将其从路径中移除,让.NET 6有机会运行,解决了我的问题。我认为卸载旧版本甚至更好,但至少有一个工具会检查是否存在.NET Core 3.1 Desktop,这种行为是有缺陷的。 - Bent Tranberg
1
无法编辑上一条评论,只剩下几个看起来像是4.6/47和6.0的dll文件,这没问题。 - Martin Freedman
1
dotnet --info 的输出是什么?.NET Core SDK - 2.1.202(x64) 明显不是6.0,而是非常过时的版本。 - PMF
显示剩余8条评论
2个回答

0
请使用Windows中的People应用程序或Visual Studio Installer向Microsoft报告。
目前只有一种选择:使用Visual Studio 2019,或者尝试寻找替代方案。应该可以在网络上找到其他选项。
我建议使用Rider IDE(在开发人员修复此问题之前):下载Rider IDE 我并不是在打广告,只是建议一款IDE来编译和运行你的程序。

我的备选是 VSCode,它工作得很好,但对于 F# 来说,Visual Studio 是一个更好的 IDE,至少对我来说是这样。我将尝试使用 Rider 进行比较。 - Martin Freedman
来到这里,是因为我想知道其他人是否和我一样在使用VS + F#时感觉很慢。在我的电脑上,Rider在F#语言服务方面非常快。 - citykid

0

我不知道为什么,但我运行了Chris Titus的Windows debloat进行了一般的清理,例如启动、服务和删除旧的/未使用的程序,结果解决了问题!这对其他人来说并不是真正的答案,但也许可以帮助某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接