Статичен метод в инстанции

Директен въпрос: Ако стартирам анализ на кода, той ми казва да направя методите статични дори в нестатични класове. Доколкото знам, статичните методи са JITed и се изпълняват на Type-Object в Heap. Така че няма ли да направи метод статичен в нестатичен клас означава, че екземплярът трябва да търси обекта тип в Heap и да изпълни метода там?

Това няма ли да означава проблем с производителността? Разбира се, няма да е толкова голяма сделка, но все пак ще се интересувам от това.


person Matthias Müller    schedule 12.11.2014    source източник
comment
Потенциален дубликат: stackoverflow .com/questions/874363/   -  person Philip Pittle    schedule 12.11.2014
comment
Това е проблем с производителността. Нестатичният метод има скрит параметър - препратка към екземпляра на класа. Ако не се използва справка, по-добре е този метод да бъде статичен, като се изключи допълнителен параметър на метода.   -  person Alex F    schedule 12.11.2014
comment
Също интересно: stackoverflow.com/questions/135020 /   -  person Philip Pittle    schedule 12.11.2014
comment
stackoverflow.com/a/12279898/113683 дава подробно обяснение   -  person Jonny Cundall    schedule 12.11.2014
comment
Ако обмисляте да използвате статични методи, запомнете, статичните предполагат безопасност на нишката!!! Статичен метод може да бъде извикан от всяка нишка по всяко време и зависи от статичния метод да се увери, че правилно обработва паралелността. Поради тази причина обикновено избягвам статични методи, които не са строго необходими.   -  person Philip Pittle    schedule 12.11.2014
comment
@PhilipPittle Здрав разум: Ако анализът на кода му казва да направи даден метод статичен, това е, защото той никога не препраща към нищо в обекта - така се прилага правилото. Което означава, че по дефиниция не може да промени обекта.   -  person TomTom    schedule 12.11.2014
comment
@TomTom - Има допълнителни условия за състезание, които могат да възникнат, които нямат нищо общо с хост обекта. Ако статичният метод извиква услуга за данни (т.е. база данни) по начин, който не е безопасен за нишки, това може да причини условия на състезание.   -  person Philip Pittle    schedule 12.11.2014
comment
И как биха извикали базата данни по небезопасен начин? БЕЗ същото да се прилага към методите на екземпляр (като използване на клас за свързване на статична db без нишка)? Запомнете: Анализът предлага методите да бъдат направени статични, защото НЯМАТ СЪСТОЯНИЕ В ОБЕКТА.   -  person TomTom    schedule 12.11.2014


Отговори (3)


Не, не става така.

Статичният метод всъщност (неусетно) е по-ефективен от нестатичния, защото (a) няма скрит указател „this“, предаден към него и (b) тъй като е статичен, рамката не трябва да прави нищо за това, че е виртуален (въпреки че последната точка се отнася и за невиртуалните методи на членове, разбира се).

Ето една задълбочена статия относно обработката на типове по време на изпълнение на CLR. По-специално , вижте информацията там за MethodTable и Method Slot Table.

Ето още един добра статия от Джо Дъфи. Тя не говори изрично за статични методи, но обяснява как се правят извиквания на методи на най-ниското (асемблер) ниво, така че ще можете да видите защо извикването на статичен метод е ефикасен.

person Matthew Watson    schedule 12.11.2014
comment
Добре, това изглежда правилно, но трябва да търси обекта тип, за да го изпълни, нали? - person Matthias Müller; 12.11.2014
comment
@MatthiasMüller Прави това само по време на JIT процеса, т.е. само веднъж в живота на програмата. За пълни подробности разгледайте тази примерна глава от Jeffrey Richter CLR чрез C# книга (Търсене при извикване на статичен метод) - person Matthew Watson; 12.11.2014

Добра публикация за сравнение на производителността на статични методи спрямо методи на екземпляр: Ефективност на статични методи спрямо екземпляр методи

TLDR:

  • Най-често разходите за производителност на екземпляр спрямо статични са под пренебрежимо малки.
  • Каквито разходи има обикновено ще дойдат, когато злоупотребявате със статика например или обратното. Ако не го направите част от вашето решение между статичен и екземпляр, е по-вероятно да получите правилния резултат.

  • Има редки случаи, при които статичните генерични методи в друг тип водят до създаване на по-малко типове, отколкото генеричните методи на екземпляри, което може да доведе до малка полза понякога да се използва рядко (и „рядко“ се отнася до това с кои типове се използва в живот на приложението, а не колко често се извиква). След като разберете това, за което той говори в тази статия, ще видите, че това така или иначе е 100% неуместно за повечето статични решения срещу екземпляри.

person Pavel Krymets    schedule 12.11.2014

Мисля, че въпросът е, че не извиквате статичен метод на екземпляр, а на самия клас. Всеки метод, който не разчита директно на информация за екземпляр, може (и въз основа на анализ на код също трябва) да бъде маркиран като статичен и след това да бъде извикан по следния начин:

NonstaticClass.TheStaticMethod();

вместо това, ако това

NonstaticClass inst = new NonstaticClass();
inst.TheStaticMethod();

Това е така, защото са необходими по-малко разходи за търсене и изпълнение на статичен метод, отколкото нестатичен метод на екземпляр на клас.

person Thorsten Dittmar    schedule 12.11.2014
comment
Въпросът ми беше повече за това защо се чува по-малко, вместо повече, след като трябва да търси типа в Heap - person Matthias Müller; 12.11.2014
comment
ААА разбирам. Както други отговориха, въпросът не е да се грижите за this указател и VMT. - person Thorsten Dittmar; 12.11.2014