Wywołanie metody Invoke trwa za długo

Wywołanie metody Invoke trwa za długo
FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
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ć?

Kopiuj

            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)

Kopiuj
wywolaj: 689
wywolaj: 67
wywolaj: 63
wywolaj: 64
wywolaj: 65
wywolaj: 69
wywolaj: 63
wywolaj: 64
wywolaj: 63
wywolaj: 65
wywolaj: 64
wywolaj: 65
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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ć.

FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
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?

  • Rejestracja: dni
  • Ostatnio: dni
0

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

czyli to:

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

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

Kopiuj
            instanceOfMyType = Activator.CreateInstance(type);

żeby wymusić JIT
albo użyć NGena

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
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.

FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
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

Kopiuj
m.Invoke(instanceOfMyType, new object[] { null, 0 });
katelx
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Hong Kong
0

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

FR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.