У меня есть приложение WinForms, написанное на VB.NET для Framework 4.5. Я заметил, что время запуска приложения необычно велико (другие написанные мной приложения, которые выполняют еще больше работы при запуске, запускаются почти мгновенно, этому приложению требуется> 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
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
И, наконец, я прибываю на мероприятие 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
Теперь вывод 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
Вы можете видеть, что основная пауза происходит между Application.Run()
и Sub InitializeComponent()
. Из других вопросов я знаю, что для потока графического интерфейса запускается цикл сообщений, но я не знаю, почему для этого приложения он должен быть намного медленнее, чем для других приложений.
Итак, мой вопрос: что именно происходит между Application.Run и моментом, когда я восстанавливаю контроль над своим кодом, и могу ли я что-то сделать, чтобы ускорить его? Связана ли выполненная там работа с компонентами формы?
Я уже пробовал использовать frmMain.ShowDialog()
вместо Application.Run(frmMain)
, но это привело к тем же результатам. Я использую Visual Studio Express, поэтому, к сожалению, я не могу использовать более глубокий профилировщик производительности.
Отметив это как C#, так и VB.NET, потому что очень приветствуются ответы на обоих языках.
EDIT
Я провел еще несколько тестов, включая предложенное решение в ответе SLaks. Использование NGEN
для предварительной компиляции сборки не дало заметного эффекта. Так что я думаю, что это не JIT-компиляция кода InitializeComponent
.
Однако я заметил, что на других системах программа запускалась практически мгновенно (> в 10 раз быстрее), даже если рассматриваемый компьютер был медленнее во всех отношениях. Различие между компьютерами заключалось в операционной системе:
Windows 7: Slow start
Windows 8.1: Fast start
Windows Server 2008: Fast start
Это просто дополнительные подсказки, я действительно не знаю, полезно ли это для ответа.
EDIT 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: "
В дальнейшем проблема возникает только в сборке Release и только тогда, когда я запускаю программу непосредственно из проводника Windows. Сборка отладки запускается мгновенно (0,3 секунды по сравнению с 5-10 секундами), как и сборка выпуска при запуске из Visual Studio.
Sub New
и посмотрите, куда он падает. - person SLaks   schedule 15.12.2014