Jen*_*ens 13 c# vb.net app-startup winforms
我有一个用VB.NET for Framework 4.5编写的WinForms应用程序.我注意到应用程序的启动时间非常长(我编写的其他应用程序在启动时几乎立即启动更多工作,此应用程序需要> 5秒)启动时间在多次启动后不会改变,所以我猜在第一次启动应用程序时,不是未缓存的CLR代码的情况.
我在启动时写下了一些测试:
Module modMain
Public MyLog As System.Text.StringBuilder
<STAThread>
Public Sub Main()
MyLog = New System.Text.StringBuilder
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
MyLog.AppendLine("Before run: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
Application.Run(frmMain)
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
Sub Main()
是应用程序的入口点.它运行frmMain
,我控制的第一个真正的东西是Sub InitializeComponent()
,由设计师生成:
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
MyLog.AppendLine("Init Start: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
'All the control initializations
MyLog.AppendLine("Init End: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
End Sub
Run Code Online (Sandbox Code Playgroud)
最后我到达了这个Form.Load
活动
Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
MyLog.AppendLine("Form_Load Start: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
'...
MyLog.AppendLine("Form_Load End: " & Date.Now.ToString & "," & Date.Now.Millisecond.ToString)
End Sub
Run Code Online (Sandbox Code Playgroud)
现在,MyLog的输出如下:
Before run: 15.12.2014 19:56:47,579
Init Start: 15.12.2014 19:56:51,451
Init End: 15.12.2014 19:56:51,521
Form_Load Start: 15.12.2014 19:56:51,544
Form_Load End: 15.12.2014 19:56:51,547
Run Code Online (Sandbox Code Playgroud)
你可以看到主要的暂停发生在Application.Run()
和之间Sub InitializeComponent()
.我从其他问题中知道,为GUI线程启动了一个消息循环,但我不知道为什么它对于这个应用程序应该比其他应用程序慢得多.
所以我的问题是:Application.Run与我重新控制代码之间究竟发生了什么,我能做些什么来加快速度吗?在那里完成的工作是否与表单上的组件有关?
我已经尝试使用frmMain.ShowDialog()
而不是Application.Run(frmMain)
,但这导致了相同的结果.我正在使用Visual Studio Express,所以不幸的是我无法使用更深入的性能分析器.
将其标记为C#和VB.NET,因为非常欢迎使用这两种语言的答案.
编辑
我已经做了一些测试,包括SLaks答案中提出的解决方案.使用NGEN
预编译大会似乎没有任何效果noticable.所以我猜这不是InitializeComponent
代码的JIT编译.
然而,我注意到,在其他系统上,程序几乎是即时启动的(> 10倍快),即使有问题的计算机在所有方面都较慢.计算机之间的区别是操作系统:
Windows 7: Slow start
Windows 8.1: Fast start
Windows Server 2008: Fast start
Run Code Online (Sandbox Code Playgroud)
这些只是更多的线索,我真的不知道它是否对答案有帮助.
编辑2
在启动期间查看ProcMon我发现执行挂起在以下行:
"15:56:29.3547260","Electrochemical Calculator.exe","5972","CreateFile","C:\Users\Jens\Desktop\Electrochemical Calculator Barebone\Electrochemical Calculator\bin\Release\de\Electrochemical Calculator.resources.dll","PATH NOT FOUND","Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a"
"15:56:29.3548019","Electrochemical Calculator.exe","5972","CreateFile","C:\Users\Jens\Desktop\Electrochemical Calculator Barebone\Electrochemical Calculator\bin\Release\de\Electrochemical Calculator.resources\Electrochemical Calculator.resources.dll","PATH NOT FOUND","Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a"
"15:56:29.3548612","Electrochemical Calculator.exe","5972","CreateFile","C:\Users\Jens\Desktop\Electrochemical Calculator Barebone\Electrochemical Calculator\bin\Release\de\Electrochemical Calculator.resources.exe","PATH NOT FOUND","Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a"
"15:56:29.3549519","Electrochemical Calculator.exe","5972","CreateFile","C:\Users\Jens\Desktop\Electrochemical Calculator Barebone\Electrochemical Calculator\bin\Release\de\Electrochemical Calculator.resources\Electrochemical Calculator.resources.exe","PATH NOT FOUND","Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a"
"15:56:32.8796760","Electrochemical Calculator.exe","5972","CreateFile","C:\Windows\Fonts\StaticCache.dat","SUCCESS","Desired Access: Generic Read, Disposition: Open, Options: Synchronous IO Non-Alert, Non-Directory File, Attributes: n/a, ShareMode: Read, Delete, AllocationSize: n/a, OpenResult: Opened"
"15:56:32.8797088","Electrochemical Calculator.exe","5972","QueryStandardInformationFile","C:\Windows\Fonts\StaticCache.dat","SUCCESS","AllocationSize: 9,633,792, EndOfFile: 9,633,792, NumberOfLinks: 1, DeletePending: False, Directory: False"
"15:56:32.8797218","Electrochemical Calculator.exe","5972","ReadFile","C:\Windows\Fonts\StaticCache.dat","SUCCESS","Offset: 0, Length: 60, Priority: Normal"
"15:56:32.8797429","Electrochemical Calculator.exe","5972","CreateFileMapping","C:\Windows\Fonts\StaticCache.dat","FILE LOCKED WITH ONLY READERS","SyncType: SyncTypeCreateSection, PageProtection: "
Run Code Online (Sandbox Code Playgroud)
问题仅在Release版本中进一步发生,并且仅在我直接从Windows资源管理器启动程序时才会出现.调试版本立即启动(0.3秒,相比之下5-10秒),从Visual Studio启动时版本构建也是如此.
Han*_*ant 12
好吧,你消除了启动延迟的所有正常来源.它绝对与Application.Run()没有任何关系,它直到表单的InitializeComponent()方法完成运行后才开始.并且您通过使用Ngen.exe消除了jitting开销.确保区分冷启动延迟和热启动延迟,如果第一次启动程序时速度很慢,那么这是一个硬件问题,需要更快的磁盘.事实上,它在某些机器上只是很慢,这强烈地指出了环境问题.
由在InitializeComponent()中运行的代码触发.换句话说,表单上控件的所有构造函数和属性设置器.这通常需要很短的时间,但肯定有麻烦制造者.你需要寻找一个非平凡的控件,特别是那种使用COM(又名ActiveX)的控件.像WebBrowser一样.还有更多的可能性,类名以"Ax"开头的任何东西.这样的控件可以加载许多其他DLL,并且易于被安全软件感兴趣.
一些调试技巧: