为什么.NET应用程序至少有一秒的启动延迟?[关闭]

vltsax25  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(220)

已关闭。此问题为opinion-based。目前不接受回答。
**要改进此问题吗?**更新此问题,以便editing this post可以使用事实和引文来回答。

20天前关闭。
Improve this question
我正在寻找一种具有以下参数的语言:
1.简单易读的语法。
1.轻松创建Windows用户界面的能力。
1.本机支持Windows应用程序。
1.上级性能和快速启动时间。
1.可移植性,无需大量安装,如10-20 GB的Visual Studio IDE。
1.它应该已经被广泛使用,并拥有一个庞大的社区。
我发现VB 6满足了我的需求,但不幸的是,它不再支持。因此,我尝试了VB.NET。我发现转换相当容易,VB代码比C#/C++更可读和简洁。正如我所提到的,我不想安装任何东西,所以我没有尝试.NET 6和7。我的目标是尽可能多地使用内置工具,如vbc.exe或便携式工具。然而,.NET框架的问题是启动时间始终保持在1-2秒之间,无论代码的重要性或使用的语言(VB或C#)。相比之下,VB 6应用程序立即启动。下面是一个用VB .NET编写的示例:

  1. Imports System.Windows.Forms
  2. Imports System.Drawing
  3. Public Class Form1
  4. Inherits Form
  5. Private WithEvents button As New Button()
  6. Private WithEvents textBox As New TextBox()
  7. Public Sub New()
  8. button.Text = "Browse"
  9. button.Location = New Point(10, 10)
  10. Me.Controls.Add(button)
  11. textBox.Location = New Point(10, 40)
  12. Me.Controls.Add(textBox)
  13. End Sub
  14. End Class
  15. Module Module1
  16. Sub Main()
  17. Application.Run(New Form1)
  18. End Sub
  19. End Module

字符串
我所做的:
1.

  1. CD C:\Windows\Microsoft.NET\Framework64\v4.0.30319
  2. NGEN update


1.我尝试了vbc.exe(和csc.exe)编译器的各种选项,比如/optimize[+|-]/platform
1.不同版本的.NET Framework(32位和64位),包括版本2、3.5和4.x.x。
1.使用msbuild.exe通过以下命令编译我的应用程序:
msbuild /property:Configuration=Release;UseDotNetNativeToolchain=true MyFile.vbproj
以下是MyFile.vbproj内容:

  1. <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" Sdk="Microsoft.NET.Sdk" >
  2. <PropertyGroup>
  3. <OutputType>WinExe</OutputType>
  4. <TargetFramework>net5.0</TargetFramework>
  5. <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
  6. </PropertyGroup>
  7. <ItemGroup>
  8. <Compile Include="DiCalc.vb" />
  9. </ItemGroup>
  10. <Target Name="Build">
  11. <Vbc Sources="@(Compile)" OutputAssembly="DiCalc.exe" TargetType="WinExe"/>
  12. </Target>
  13. </Project>


先谢了。

更新一:

1.我的系统上没有安装任何防病毒软件。SmartScreen筛选器和Windows Defender当前都已禁用。
1.我不使用任何共享网络文件夹。实际上,我在M.2 NVMe SSD上进行了测试。

**更新2:**以下是更详细的测试:

VB6 and VB.NET-x86 video
VB.NET-x64 video
test.vb

  1. Imports System.Windows.Forms
  2. Imports System.Drawing
  3. Public Class Form1
  4. Inherits Form
  5. Private button As New Button()
  6. Public Sub New()
  7. Me.BackColor = Color.FromArgb(14, 14, 14)
  8. Me.ForeColor = Color.FromArgb(240, 240, 240)
  9. button.Text = "Browse"
  10. button.Location = New Point(10, 10)
  11. button.BackColor = Color.FromArgb(14, 14, 14)
  12. button.ForeColor = Color.FromArgb(240, 240, 240)
  13. Me.Controls.Add(button)
  14. End Sub
  15. End Class
  16. Module Module1
  17. Sub Main()
  18. Application.Run(New Form1)
  19. End Sub
  20. End Module


编译命令:
X64
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc.exe /t:winexe /platform:x64 /out:VB.NET-x64.exe test.vb
X86
C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe /t:winexe /platform:x86 /out:VB.NET-x86.exe test.vb
平均延迟:

  1. VB.NET-x64.exe => ~320 ms
  2. VB.NET-x86.exe => ~650 ms
  3. VB6-x86.exe => ~80 ms


因此,VB 6的启动时间比VB.NET快4到8倍。
注意:要查看实际延迟,请确保禁用动画,并通过文件夹选项a启用资源管理器中的单击。

更新3:我下载了.NET 8 SDK zip压缩包来测试它,并确定提前编译(AOT)是否会改善启动时间,类似于VB 6。下面是.vbproj文件的内容:

  1. <Project Sdk="Microsoft.NET.Sdk" >
  2. <PropertyGroup>
  3. <OutputType>WinExe</OutputType>
  4. <TargetFramework>net8.0-windows</TargetFramework>
  5. <UseWindowsForms>true</UseWindowsForms>
  6. <PublishAot>true</PublishAot>
  7. <StripSymbols>true</StripSymbols>
  8. <PublishTrimmed>false</PublishTrimmed>
  9. <SelfContained>true</SelfContained>
  10. <PublishReadyToRun>true</PublishReadyToRun>
  11. </PropertyGroup>
  12. <ItemGroup>
  13. <PackageReference Include="System.Windows.Forms" />
  14. </ItemGroup>
  15. </Project>


编译命令:

  1. dotnet.exe build /p:Configuration=Release /p:UseNativeAOT=true


结果是一个大小约为150 MB的应用程序,但延迟与之前相同。

wvmv3b1j

wvmv3b1j1#

首先,我的vb.net应用程序中没有一个在启动时出现这种延迟。
如果您创建的是vb.net windows .net framework窗体应用程序,则启动时间不会显示任何延迟,甚至不会显示可感知的启动延迟。
让我们做一个hello world:
文件->新项目。
这一个:
x1c 0d1x的数据
因此,让我们构建类hello world示例。
我们在表单上拖动一个按钮,然后编写以下代码:



然后按f5运行。
(实际上,我们使用鼠标并点击开始按钮)。
我们看到了这一点,并看到非常小的延迟:

当然,我们从Visual Studio运行这个,但是让我们右键单击项目,选择“在浏览器中打开文件夹”,然后从Windows资源管理器运行.exe文件(不是从Visual Studio运行/启动)。所以,让我们从Windows资源管理器(甚至命令提示符)启动.exe文件。
所以,我们现在有了这个文件夹,当我点击.exe文件时,我没有看到2秒的等待,我没有看到1秒的等待,事实上,表单启动时没有任何感知延迟。
所以,我看到这个:



现在,我正在使用screen to gif,它以每秒15帧的速度运行,所以你看到的是“一些什么”比在自己的电脑上做这个慢的效果和响应时间。
但是,screentogif(我使用的屏幕捕捉软件)确实显示一个圆形的圆圈,当我点击鼠标。所以,当我双击.exe文件(运行它),然后可以看到鼠标点击“圆圈”从screentogif软件 Flink 两次。
现在,我没有计算捕获的视频帧的数量,但它看起来不超过1帧延迟。所以,这是至少1/15秒,但实际上很可能更少的时间。
换句话说,我们在1/10秒内加载并运行.exe文件。
即使我用.net core创建了上述相同的项目,我也看不到也找不到任何可感知的启动延迟。

  • 所以,我不知道.net有一些大的延迟,或启动时间,它真的不需要运行任何不同的启动时间,然后说,与VB6.exe的启动时间相比。

我想在非常弱的旧硬件上,那么VB 6可能有更好的启动时间,但它不应该是真的很明显,它肯定不是在1-2秒的范围内.对于一个非常大的.net应用程序,然后在第一次运行,你经常可以看到延迟,因为.exe实际上还没有编译成机器码!当你构建一个. net.exe的时候,这个exec实际上还没有编译机器码),它有一个叫做p-code的东西(就像VB 5/6一样)。这就是所谓的“IL”代码(中间语言或所谓的“p-code”)尚未编译,并且这种代码编译仅在您首次运行代码时发生!因此,.net有一个JIT(Just in time compiler system,即时编译器系统),代码在你使用它的时候编译,第一次运行。然而,正如我指出的,对于上面简单而小的应用程序,在启动时根本不应该有这样的延迟。
编译只需要发生一次,之后,编译的代码被记住。这与磁盘缓存和程序的加载无关-它只针对用于编译和运行.exe文件的JIT系统。
这表明这里有其他问题,例如您的病毒软件扫描并阻止.exe启动,直到病毒扫描软件可以首先完成检查.exe文件。
或者,有一些网络共享文件夹,你在这里使用,或其他一些大的细节,你没有与我们分享。
事实上,如上所示,从Visual Studio 2022中按f5甚至不需要2秒!但按f5是一个完整的编译,+构建,然后运行。(多个操作,其中一个用户永远不会看到)。
因此,通过双击文件或从命令提示符键入.exe文件名来运行从该VS项目创建的.exe文件,大多数情况下肯定会启动,并在一秒内运行,更不用说两秒了。
请记住,我是在一台笔记本电脑上运行这个程序的,而不是一台高端规格的笔记本电脑,更不用说一台更好、更强大的台式电脑了。
而且,如果我创建一个.net core winforms.exe,然后再一次,我没有感觉到任何延迟。我当然看到更多的文件在.bin文件夹中作为构建的结果,但我没有看到变化,也没有增加加载时间时使用.net core。我可能会尝试冷启动(重新启动),但我怀疑它会有什么不同。

展开查看全部

相关问题