Długi czas uruchamiania się okna głównego aplikacji.

0

Witam.

Mam taki problem:
Po uruchomieniu programu mija klika sekund zanim pojawi się formatka programu.
Sprawdziłem czas między kolejnymi etapami i wyszło, że pomiędzy wywołaniem Application.Run(new Form1()); (w program.cs) a wejściem do konstruktora (czas mieżyłem przed InitializeComponent()

public Form1()
{
	InitializeComponent();
}

mija ponad 3 sekundy.

Pytanie do Was: co dzieje się w "między czasie"?

0

Jak mierzyłeś czas?

0

W dość prowizoryczny sposób muszę przyznać...

Stworzyłem klasę statyczną z listą i przed wspomnianym punktami dodawałem aktualny czas (sekundy i milisekundy).

0

Ale to się dzieje jak odpalasz z VS czy z exe? Jak z exe to za drugim i trzecim też?

0

Dodałem w kodzie coś takiego:
program.cs

static void Main(string[] args)
{
	Application.EnableVisualStyles();
	Application.SetCompatibleTextRenderingDefault(false);
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "Before Application.Run(new Form1())");
	Application.Run(new Form1());
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "After Application.Run(new Form1())");
} 

form1.cs

public Form1()
{
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "Before InitializeComponent");
	InitializeComponent();
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "After InitializeComponent");
}

Wynik jaki otrzymuje:
próba 1

09.53.30.578635	Before Application.Run(new Form1())
09.53.34.169542	Before InitializeComponent
09.53.34.194560	After InitializeComponent

próba 2

09.59.17.395198	Before Application.Run(new Form1())
09.59.20.813166	Before InitializeComponent
09.59.20.835173	After InitializeComponent

próba 3

10.01.11.880207	Before Application.Run(new Form1())
10.01.15.336046	Before InitializeComponent
10.01.15.359074	After InitializeComponent

Program uruchamiany bezpośrednio z exe.

0

To jakaś bzdura, przecież Application.Run(new Form1()); zawiera new Form1(), które uruchamia konstruktor.

Spróbuj rozbić to na dwie linijki:

Form1 form = new Form1();
log.events.Add(...);
Application.Run(form);

i jakie masz wtedy czasy?

Pytanie do Was: co dzieje się w "między czasie"
Konstruktor klasy bazowej (Form)

?
Nie stawiamy spacji przed znakiem zapytania.
(doprawdy: skąd się ta moda wzięła ostatnio? nie było tego, a teraz się panoszy)

0

Kod po zmianie:
program.cs

	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "Step 1");
	Form1 form = new Form1();
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "Step 2");
	Application.Run(form);
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "Step 3");

form1.cs

public Form1()
{
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "Step 4");
	InitializeComponent();
	log.events.Add(DateTime.Now.ToString("hh.mm.ss.ffffff") + "Step 5");
}

Wynik:

10.35.22.039664	Step 1
10.35.25.439240	Step 4
10.35.25.461255	Step 5
10.35.25.461255	Step 2

Pytanie do Was: co dzieje się w "między czasie"
Konstruktor klasy bazowej (Form)

No tak tylko, ten czas mija przed wejściem do konstruktora.

?
Nie stawiamy spacji przed znakiem zapytania.
(doprawdy: skąd się ta moda wzięła ostatnio? nie było tego, a teraz się panoszy)

Nie mam pojęcia, staram się pilnować, ale czasem się zapomnę :/.

0

Zamiast kombinować ze swoimi metodami użyj przeznaczonej do tego klasy Stopwatch.

0

program.cs

log.stopwatch.Start();
log.add("1");
Form1 form = new Form1();
log.add("3");
log.stopwatch.Stop();
Application.Run(form); 

form1.cs

public Form1()
{
	log.add("2");
	InitializeComponent();
}
public static class log
{
	public static Stopwatch stopwatch = new Stopwatch();
	public static List<String> events = new List<string>();

	public static void add(string x)
	{
		events.Add(log.stopwatch.Elapsed.ToString() + "\tStep " + x);
	}
}
Próba 1:
00:00:00.0001911	Step 1
00:00:03.4000917	Step 2
00:00:03.4234447	Step 3

Próba 2:
00:00:00.0002235	Step 1
00:00:03.4676106	Step 2
00:00:03.4890058	Step 3

Próba 3:
00:00:00.0002280	Step 1
00:00:03.4477901	Step 2
00:00:03.4697897	Step 3

0

Możesz uruchomić swój program w normalnym profilerze Visual Studio? Spróbuj zngen-ować swój program i potem go uruchomić oraz podać wyniki.

0

@Rev - kombinowałem coś z profilerem ale nie wiele się z niego dowiedziałem (zapewne wynika to z nieumiejętności posługiwania się tym narzędziem - jeżeli możesz to podpowiedz jaki raport powinienem zrobić), dlatego zrobiłem w ten sposób.

Spróbuj zngen-ować swój program

Zaraz spróbuje dowiedzieć się czym jest ngen i go wykorzystać :).

0

Dla mnie ten zapis jest nieczytelny. Co to jest step 1? Czas się dodaje czy jakoś go resetujesz?

0

Uzupełniłem poprzedni post o kod klasy log, myślę, że teraz będzie wiadomo o co chodzi.

0

Skompiluj coś takiego pod konsolą i podaj wyniki.

using System;
using System.Windows.Forms;

class MyForm : Form
{
	static DateTime start;

	MyForm()
	{
		log("ctor");
	}

	static void log(string msg)
	{
		Console.WriteLine("{0}\t{1}", msg, DateTime.Now - start);
	}

	static void Main(string[] args)
	{
		start = DateTime.Now;

		log("evs");
		Application.EnableVisualStyles();

		log("sctrd");
		Application.SetCompatibleTextRenderingDefault(false);

		log("new");
		var form = new MyForm();

		log("run");
		Application.Run(form);
	}
}

U mnie na netbooku z wirtualką w tle, a na wirtualce jedzie długa kompilacja, na dodatek cały czas mieli swap bo jest tylko 2 GB RAMu:

c:\PP\myprogs\cs>csc from.cs
Microsoft (R) Visual C# Compiler version 1.0.0.50618
Copyright (C) Microsoft Corporation. All rights reserved.


c:\PP\myprogs\cs>from
evs     70,004
sctrd   177,0101
new     195,0111
ctor    654,0374
run     655,0374

c:\PP\myprogs\cs>from
evs     13,0007
sctrd   21,0012
new     24,0014
ctor    86,0049
run     88,005

c:\PP\myprogs\cs>from
evs     16,0009
sctrd   24,0014
new     26,0015
ctor    87,005
run     88,0051

Między new a konstruktorem jest dłuższa przerwa, ale nawet w pierwszym uruchomieniu trwa ona pół sekundy, a nie kilka sekund.
Chyba że masz baaardzo słaby komputer?

0
C:\from>csc from.cs
Microsoft (R) Visual C# Compiler version 12.0.31101.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.


C:\from>from.exe
evs     00:00:00.0060042
sctrd   00:00:00.0140641
new     00:00:00.0149355
ctor    00:00:00.0239432
run     00:00:00.0239432

C:\from>from.exe
evs     00:00:00.0040022
sctrd   00:00:00.0060213
new     00:00:00.0060213
ctor    00:00:00.0100071
run     00:00:00.0100071

C:\from>from.exe
evs     00:00:00.0030021
sctrd   00:00:00.0050035
new     00:00:00.0050035
ctor    00:00:00.0090063
run     00:00:00.0090063 

Komputer do najgorszych nie należy.
2cac633652.png

A wytłumaczcie mi proszę co dzieje się w ogóle w trakcie wywołanie Form1 form = new Form1(); (a przed wejściem do konstruktora public Form1())?

1

Po wywołaniu new Form1() a przed wejściem w konstruktor wykonuje się statyczny konstruktor klasy i ładowane są wszystkie biblioteki z referencji potrzebne do stworzenia klasy Form1
Bardzo prawdopodobne że masz po prostu jakąś zmienną w klasie inicjowaną statycznie (pobieranie danych z bazy?)

Czy korzystasz może z DevExpress? Ma on taki bug że forma potrafi się ładować kilkanaście sekund w trybie Any. Przełączenie w tryb kompilacji x86 skraca czas do ułamka sekundy. Może tak też być w przypadku innych bibliotek

0

Wszystko jasne :).

Miałem w form1.cs parę obiektów innych klas tworzonych "od razu" (nie wiem jak to "fachowo" nazwać") czyli:

public partial class Form1 : Form
{
	private Foo foo = new Foo();
	private Foo1 foo1 = new Foo1();
	private Foo2 foo2 = new Foo2();
}

zmieniłem to na

public partial class Form1 : Form
{
	private Foo foo = null;
	private Foo1 foo1 = null;
	private Foo2 foo2 = null;
}

a przypisanie przeniosłem po wyświetleniu formy - dzięki temu wyświetla się prawie natychmiast.

W sumie nie wiem jak sobie wyobrażałem tworzenie tych referencji (tzn kiedy)...

1 użytkowników online, w tym zalogowanych: 0, gości: 1