Wywołanie metody Invoke trwa za długo

0

Mam problem z w/w metodą. Otóż przy pierwszym uruchomieniu programu który dynamicznie wczytuje DLL'kę metodą invoke, zawsze czas jej wywoływania jest ogromnie duży - 600ms. Niezależy on od wielkości danych. Kolejne wywołania metody są już w czasie ok 60ms. Czuje, że to wina tworzenia nowych obiektów w pamieci, lub coś podobnego... ktoś wie, jak się z tym rozprawić?


            dllPath = @"xxx.dll";
            assembly = Assembly.LoadFrom(dllPath);
            type = assembly.GetType("klasa");
            instanceOfMyType = Activator.CreateInstance(type);
            m = type.GetMethod("metoda");
            sw.Reset();
            sw.Start();
            m.Invoke(instanceOfMyType,  new object[] { this.tab, this.tab.Length });  // tutaj jest problem
            sw.Stop();
            Console.WriteLine("wywolaj: " + sw.ElapsedMilliseconds.ToString());   

Wyniki(ms)

wywolaj: 689
wywolaj: 67
wywolaj: 63
wywolaj: 64
wywolaj: 65
wywolaj: 69
wywolaj: 63
wywolaj: 64
wywolaj: 63
wywolaj: 65
wywolaj: 64
wywolaj: 65
0

Kolejne wywołania metody są już w czasie ok 60ms
Kolejne wywołania metody, czy całego programu?

Weź pod uwagę, że za pierwszym wywołaniem funkcji odpalany jest JIT, czyli kompilator z kodu pośredniego do natywnego, i to może trochę potrwać.

0

Samej metody, ponieważ kod powyżej jest w pętli for. Zresztą jak iwdać wyżej mierze tylko samo odniesienie sie do dll. Pomiary czasu są ważne dla mnie, ponieważ są częścią projektu, a każdym pierwszym razem po włączeniu programu czas jest bardzo wysoki... Nie dało by się zainicjować tego JIT jakoś w kontruktorze, żeby podczas pomiaru wyniki wychodziły normalne?

0

możesz wczytać dll-kę w konstruktorze - to zapewne trwa najdłużej bo odwołuje się do dysku

czyli to:

 dllPath = @"xxx.dll";
            assembly = Assembly.LoadFrom(dllPath);
            type = assembly.GetType("klasa");

wrzuć do konstruktora
możesz też wywołać już wtedy

            instanceOfMyType = Activator.CreateInstance(type);

żeby wymusić JIT
albo użyć NGena

1

Możesz nie brać pod uwagę czasu pierwszego wywołania metody...

Albo wywołać tę metodę z pustymi danymi (tablicą o długości 0 albo wskaźnikiem null). Jeśli jest prawidłowo napisana, to nic nie powinno się dziać, a JIT ją skompiluje przy tej okazji.

Możesz też użyć narzędzia NGEN do wygenerowania natywnej binarki, ale trzeba to zrobić na docelowym komputerze, najlepiej podczas instalacji aplikacji.

0
Krzywy Kaczor napisał(a):

możesz wczytać dll-kę w konstruktorze - to zapewne trwa najdłużej bo odwołuje się do dysku

No własnie najdłużej trwało same wywołanie m.Invoke, jak widać wyżej.

Pomogło wrzucenie do konstruktora całości wraz z

m.Invoke(instanceOfMyType, new object[] { null, 0 });
0

swoja droga to po co ta refleksja? nie mozesz po ludzku tego uzywac? ;)

0

Pokaż, jak po ludzku mam zaimportować dynamicznie dll'kę napisaną w C# ;)

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