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

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

已关闭。此问题为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编写的示例:

Imports System.Windows.Forms
Imports System.Drawing

Public Class Form1
    Inherits Form

    Private WithEvents button As New Button()
    Private WithEvents textBox As New TextBox()

    Public Sub New()
        button.Text = "Browse"
        button.Location = New Point(10, 10)
        Me.Controls.Add(button)

        textBox.Location = New Point(10, 40)
        Me.Controls.Add(textBox)
    End Sub
End Class

Module Module1
    Sub Main()
        Application.Run(New Form1)
    End Sub
End Module

字符串
我所做的:
1.

CD C:\Windows\Microsoft.NET\Framework64\v4.0.30319 
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内容:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" Sdk="Microsoft.NET.Sdk" >
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="DiCalc.vb" />
  </ItemGroup>

<Target Name="Build">
  <Vbc Sources="@(Compile)" OutputAssembly="DiCalc.exe" TargetType="WinExe"/>
</Target>

</Project>


先谢了。

更新一:

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

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

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

Imports System.Windows.Forms
Imports System.Drawing

Public Class Form1
    Inherits Form
    Private button As New Button()

    Public Sub New()
        Me.BackColor = Color.FromArgb(14, 14, 14)
        Me.ForeColor = Color.FromArgb(240, 240, 240)
        
        button.Text = "Browse"
        button.Location = New Point(10, 10)
        button.BackColor = Color.FromArgb(14, 14, 14)
        button.ForeColor = Color.FromArgb(240, 240, 240)
        Me.Controls.Add(button)

    End Sub
End Class

Module Module1
    Sub Main()
        Application.Run(New Form1)
    End Sub
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
平均延迟:

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


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

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

<Project Sdk="Microsoft.NET.Sdk" >
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <PublishAot>true</PublishAot>
    <StripSymbols>true</StripSymbols>
    <PublishTrimmed>false</PublishTrimmed>
    <SelfContained>true</SelfContained>
    <PublishReadyToRun>true</PublishReadyToRun>
  </PropertyGroup>
<ItemGroup>
    <PackageReference Include="System.Windows.Forms" />
</ItemGroup>
</Project>


编译命令:

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。我可能会尝试冷启动(重新启动),但我怀疑它会有什么不同。

相关问题