2009-07-28 14 views

Odpowiedz

17

nie zapomnij metody rozszerzenie są tylko statyczne wywołania metod owinięte cukru składniowej. Więc co tak naprawdę pytaniem jest

Czy istnieje różnica wydajności pomiędzy statycznymi i instancji metod

Odpowiedź brzmi: tak i istnieją różne artykuły dostępne na ten temat

Niektóre linki

+0

Miałem nadzieję, że zamierzasz dodać kilka cytatów do tych artykułów, ponieważ jeszcze ich nie znalazłem. Być może umieszczam niewłaściwe terminy w Google. –

+0

@Colin też :). Domyślam się, że nie trafiłem, by przesłać ostatni raz. Wypróbuj google dla "wydajności wywołania metody CLR" Większość artykułów przyjmuje ogólne podejście, ale omawia różnice między instancjami a statycznymi różnicami. – JaredPar

+0

Dzięki - Wygląda na dobrą lekturę ... Zaraz wracam :) –

5

Wątpię, by wystąpiła jakakolwiek różnica w wydajności, ponieważ jest to cukier syntaktyczny. Kompilator po prostu kompiluje go tak, jak każde inne wywołanie metody, z wyjątkiem tego, że jest to metoda statyczna w innej klasie.

Niektóre więcej szczegółów z mojego bloga o cukier składniowej: http://colinmackay.co.uk/2007/06/18/method-extensions/

+0

-1 W swoim blogu porównujesz metodę statyczną z metodą statyczną. To różni się od metody instancji ... –

+0

Ten wpis na blogu został napisany ponad dwa lata temu, a jego celem nie była odpowiedź na to dokładne pytanie.Moje włączenie polegało na wykazaniu, że Metody Rozszerzeń są cukrem syntaktycznym, pokazując leżącą u podstaw IL i sposób działania metod rozszerzenia. Ale, dziękuję za głosowanie w dół! –

0

Występuje niewielka różnica w wydajności, ze względu na liczbę argumentów przekazywanych do metody. Na przykład, spójrz na następujących klas:

public class MyClassInstance 
{ 
    public int MyProperty { get; set; } 

    public MyClassInstance(int prop) 
    { 
     MyProperty = prop; 
    } 

    public void IncrementInstance() 
    { 
     MyProperty++; 
    } 
} 

public static class MyClassStatic 
{ 
    public static void IncrementStatic(this MyClassInstance i) 
    { 
     i.MyProperty++; 
    } 
} 

uruchomiony następujący kod:

 DateTime d = DateTime.Now; 

     MyClassInstance i = new MyClassInstance(0); 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementInstance(); 
     } 

     TimeSpan td = d - DateTime.Now; 

     DateTime e = DateTime.Now; 

     for (int x = 0; x < 10000000; x++) 
     { 
      i.IncrementStatic(); 
     } 

     TimeSpan te = e - DateTime.Now; 

td = .2499 sek

Te = .2655 sek

uwagi na fakt, że metoda instancji nie musi przekazywać żadnych argumentów.

heres nieco przestarzały, ale dobry artykuł na temat wydajności

+1

Co dzieje się z odwołaniem "this" w wywołaniu metody instancji? Gdzie to idzie? Jak to się dzieje? Metoda musi ją skądś zdobyć? –

+0

zasadniczo zarówno IncrementInstance, jak i IncrementStatic wywołują metodę Set dla właściwości MyProperty. Metoda instancji odnosi się bezpośrednio do pamięci instancji, natomiast metoda statyczna odnosi się do instancji przekazanej jako argument. –

+1

Co ciekawe, wziąłem twój kod i uruchomiłem go na moim komputerze. Kiedy używam tej samej liczby iteracji, kiedy liczby przeskakują jeden drugiego. Czasami metody metody wygrywają, czasami metody rozszerzenia. Uważam, że timer nie jest wystarczająco dobry, więc ustawiam iteracje na ponad 2 miliardy (int.MaxValue), a teraz uzyskuję dość spójne wyniki. Wykonanie iteracji za pomocą metody instancji zajmuje 46 nanosekund, a jej powtórzenie za pomocą metody rozszerzenia zajmuje 45 nanosekund. Nie sądzę, że zamierzam optymalizować cokolwiek tak czy inaczej w oparciu o różnicę nanosekundy. –

3

To nie ma żadnej znaczącej różnicy. Zobacz this article.

I zweryfikowaniu wyników testu i zrobił kolejny test gdzie wariant statyczny miał parametr typu Sample. Wszystkie one trwały 11495ms (+/- 4ms) w moim systemie za 2,1 miliarda połączeń. Jak mówi artykuł, nie powinieneś się o to martwić.

Większość przykładów i testów, tu nie są ważne, ponieważ pozwalają one na metodzie inline. Szczególnie łatwe dla kompilatora, jeśli metoda jest pusta;)

(ciekawe, że test był wolniejszy w moim systemie niż ten w artykule .. nie jest to dokładnie powolne, ale może to być spowodowane 64-bitowym systemem operacyjnym)

+0

Ten link już nie działa ... – takrl

+0

Sprawdzam z autorem, czy jest gdzie indziej, gdzie umieścił go online. W międzyczasie możesz przeczytać ją na http://web.archive.org/web/20090624234442/http://gregbeech.com/blogs/tech/archive/2007/01/11/static-vs-instance-method -performance.aspx – Thorarin

+0

Dobra, dziękuję, sprawdziłem też jego bieżący blog, ale już go tam nie było. – takrl

Powiązane problemy