NET, budou prázdné volání metody optimalizovat ven?

hlasů
20

Vzhledem k tomu, prázdné tělo metody, bude SVT optimalizovat mimo volání (Já vím, C # kompilátor nebude). Jak bych mohl jít o to zjistit? Jaké nástroje bych měl používat a kde bych měl hledat?

Vzhledem k tomu, jsem si jistý, že to bude požádán, důvod prázdné metody je direktiva preprocesoru.


@Chris: To dává smysl, ale to by mohlo optimalizovat z volání metody. Takže tato metoda bude stále existovat, ale statické volání do ní mohlo být odstraněno (nebo alespoň inline ...)

@Jon: To mi právě říká jazykový překladač nedělá nic. Myslím, že to, co musím udělat, je spustit svůj dll přes NGen a dívat se na shromáždění.

Položena 15/08/2008 v 00:33
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
12

Tato kapitola má docela dobrou léčbu JIT optimalizací, do vyhledávání na stránce pro ‚metoda je prázdné‘, je to asi v polovině cesty dolů článku -

http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx

Zřejmě prázdné metody se dostat optimalizované ven inlining, co je ve skutečnosti žádný kód.

@Chris: Já si uvědomit, že tyto metody budou stále být součástí binární a že se jedná o JIT optimalizace :-). Na poznámce polo související Scott Hanselman měl docela zajímavý článek o inlining uvolňování stohů sestavení hovoru:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx

Odpovězeno 15/08/2008 v 00:43
zdroj uživatelem

hlasů
10

Hádám, že váš kód je jako:

void DoSomethingIfCompFlag() {
#if COMPILER_FLAG
    //your code
#endif
}

To nebude mít optimalizována ven, nicméně:

partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

První metoda je prázdný částečné, a C # 3 kompilátor optimalizuje to.


Mimochodem: to je v podstatě to, co dílčí metody jsou určeny pro. Microsoft přidal generátory kódu do svých návrhářů LINQ, které potřebují k volání metody, které standardně nedělají nic.

Spíše než nutit vás přetěžovat metodu, kterou lze použít k částečnému.

Tímto způsobem partials zcela optimalizované, zda není používán a není výkon je ztracen, spíše než přidávání režie navíc prázdného volání metody.

Odpovězeno 15/08/2008 v 09:38
zdroj uživatelem

hlasů
1

Všechny věci jsou stejné, ano, to by mělo být optimalizováno ven. SVT vložkou funkce, kde je to vhodné a existuje jen málo věcí, vhodnější než prázdných funkcí :)

Pokud opravdu chcete být jisti, pak změnit svůj prázdný metodu vyvolat výjimku a vytisknout trasování zásobníku, které obsahuje.

Odpovězeno 15/08/2008 v 00:41
zdroj uživatelem

hlasů
1

Ne, prázdné metody jsou optimalizovány nikdy ven. Zde je několik důvodů, proč:

  • Způsob by mohl být nazýván z odvozené třídy, například v jiné sestavě
  • Metoda by se dalo nazvat pomocí Reflection (i když je označeno jako soukromé)

Edit: Ano, při pohledu na tom (exellent) kód projektu doc ​​JITer odstraní volání prázdných metod. Ale metody samy o sobě budou i nadále sestavují a část binárního souboru z důvodů I uvedeny.

Odpovězeno 15/08/2008 v 00:39
zdroj uživatelem

hlasů
0

@Jon Limjap: My už víme, že C # kompilátor neoptimalizuje prázdné metody ven. Vzhledem k tomu, co jste rozklad s ildasm byla generována pomocí C # kompilátor ... tam žádnou pomoc.

Odpovězeno 15/08/2008 v 00:48
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more