Udržet globální proměnné nebo obnovit lokální proměnné v C?

hlasů
6

Byl jsem programování s Java pro Android docela nějaký čas teď. Vzhledem k tomu, výkon je pro věci velmi důležité, já jsem pracoval na skončím jen spam globální proměnné. Myslím, že každý přijde řítí do teď a řekni mi, že tohle je to nejhorší styl vůbec, ale umožňuje, aby to jednoduché. Pro Android, lokální proměnné znamená, odvoz odpadu a odvoz odpadu je něco, co zabíjí výkon.

V poslední době jsem začal používat NDK. Teď se cítím touhu skutečně přijmout všechny místní proměnné a měnit je na globální proměnné. Já jsem přemýšlel, ale pokud to nedává smysl v C kódu. Je zřejmé, že je k ničemu styl, ale pokud je to nezbytné pro rychlost budu obětovat styl ochotně.

Díval jsem se do starších závity o lokální vs globální, ale já jsem nebyl schopen najít nic o rychlosti. Takže moje otázka je, že když jsem volání funkce velmi často je to relevantní pro rychlost, že lokální proměnné jsou vytvářeny a umírají po funkce se děje? Nebo není to záležitost vůbec a mohu s radostí nadále využívat lokální proměnné.

Chtěl bych vyzkoušet to sám, ale z nějakého důvodu výkon mého app jde nahoru a dolů jako na horské dráze, a pochybuji, že budu moci opravdu žádný smysl dat. Doufám, že někdo mi může pomoct, než jsem přepsat celý svůj kód k ničemu :)

Položena 24/08/2010 v 23:14
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
11

Pro Android, lokální proměnné znamená, že odvoz odpadu ...

Jedná se o nesprávné prohlášení. Lokální proměnné jsou přidělovány ve frontě - ne dynamicky přidělovány na heap.Check z tohoto článku o tom, co dostane přiděleno kde v Javě

Je pravidlem, že předměty, kterým jsou přidělena zásobníku nevyžadují odvoz odpadu / uvolnění a „umírají“ hned po provedení opustí svůj současný rozsah. Stack alokace / dealokace je výrazně rychlejší než přidělení haldy a odvoz odpadu.

Snažte se vyhnout globální proměnné pro oba styly a výkonnostních důvodů. Stack přidělené lokální proměnné bude provádět mnohem rychleji.

Odpovězeno 24/08/2010 v 23:29
zdroj uživatelem

hlasů
8

V jazyce C, rozdíl výkon závisí na hardwaru. Vkládání globální na procesoru RISC je další instrukce (protože máte načíst obě poloviny adresy v samostatných pokynech, versus přidat ukazatel zásobníku), a pak se budete muset potýkat s problémy mezipaměti. Z větší části, můžete se spolehnout na své lokální proměnné bytí v mezipaměti. Používání globals budou mlátit do vyrovnávací trochu a některé funkce mohou být velmi nepříznivě ovlivněny.

Máte-li podstatnou variabilitu výkonu při spuštění aplikaci, to je docela pravděpodobné, že vaše tvrzení o vlivu výkonnosti lokálních proměnných je nevýznamný.

„Náklady“ o vytvoření lokální proměnné v C je nula; je to jen narážela registr (stack pointer), aby se prostor pro místní. Pak můžete inicializovat této proměnné přes jakýmikoliv prostředky jsou vhodné. Byste měli být schopni zjistit, jestli je to drahé nebo ne běžné kontrole. Je-li funkce ukončí, ukazatel zásobníku se vrátí na svou původní hodnotu, bez ohledu na to, kolik lokálních proměnných, které máte.

Pokud je vaše definice „lokálních proměnných“ se haldy přidělené objekty, i když budete trpět nákladů na přidělení paměti. alokace paměti je velmi pomalá podle mého názoru, tak co můžete udělat, aby se od malloc / volný (a ‚nové‘ v Javě), tím lépe se vám bude. (I vytvářet hry, a máme tendenci používat dlmalloc, ale i to je příliš pomalý pro běžné použití; 400ns za volání sčítá rychle.)

Odpovězeno 24/08/2010 v 23:23
zdroj uživatelem

hlasů
2

Na CPU MIPS- a ARM založené nalezené ve většině telefonů se systémem Android, není vůbec žádný důvod pro přesun lokálních proměnných do globálního prostoru „pro výkon.“ Místní obyvatelé jsou uloženy v zásobníku a přidělení stack je jediný op; Navíc celý stoh vyčistit najednou na volání ret. Jejich přesunutí do globálního prostoru bude jen dělat svou logiku do zavrčel nepořádek nerozluštitelný státu pro žádnou výhodu.

Na jednom místě se obávat perforace s tvorbou objektů je, když se jejich přidělování na haldě (např malloc()). To je přesně tam, kde C je „výkonnější než“ funkcí garbage collector jazyků, protože můžete vidět a řídící přesně, kdy dojde k těmto mallocs a když se uvolní. To opravdu není pravda, že C malloc()je rychleji než Java new; spíše, protože každá alokace je transparentní a explicitní pro vás, můžete tak učinit potřebné kroky, aby se ujistil, že takové pomalé operace stane pokud možno co nejméně.

Odpovězeno 24/08/2010 v 23:32
zdroj uživatelem

hlasů
0

Mimochodem, deklarovat proměnnou statickou rámci funkce C bude vám chování globální bez odhazování globální jmenný prostor.

Ale jak již bylo uvedeno, deklarovat automatické proměnné v zásobníku trvá 0 čas a přístup k tyto proměnné je také velmi rychlý, takže tam není mnoho důvodů, aby se zabránilo funkce lokální proměnné.

Pokud opravdu potřebujete tuto extrémní úroveň optimalizace byste se měli podívat na inline všechny běžně nazývá funkce, aby se zabránilo režii volání.

Odpovězeno 24/08/2010 v 23:34
zdroj uživatelem

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