C# vytváření instancí v cyklu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# vytváření instancí v cyklu – .NET – Fórum – Programujte.comC# vytváření instancí v cyklu – .NET – Fórum – Programujte.com

 

ondra
~ Anonymní uživatel
244 příspěvků
14. 10. 2015   #1
-
0
-

Dobrý den,

mám dotaz co se týče úspory procesorového času a paměti

Mám cyklus ve kterém vytvářím instanci nějaké třídy.

1)
List<Item> items = new List<Items>();
for (i = 0; i< 1000000; i++) {
	Item item = new Item();
	items.Add(item);
	....
}

2)
List<Item> items = new List<Items>();
Item item = null;
for (i = 0; i< 1000000; i++) {
	item = new Item();
	items.Add(item);
	....
}

3) 
List<Item> items = new List<Items>();
for (i = 0; i< 1000000; i++) {
	items.Add(new Item());
	....
}

Uvedl jsem schválně i variantu č.3, která je určitě nejlepší. Zajímá mně však zejména rozdíl mezi variantou 1 a 2. Vždy není možné použít variantu č.3, protože potřebuju třeba s instancí ještě pracovat než ji vložím do Listu.

Je nějaký rozdíl mezi variantou 1 a 2?

Nahlásit jako SPAM
IP: 2001:718:1001:110:1408:6d...–
Matěj Andrle+1
Grafoman
14. 10. 2015   #2
-
0
-

#1 ondra
V tomto však žádný rozdíl není! Když deklarujete proměnnou pro instanci mimo blok, tak se ukládá stále na jedno místo - je možné používat onu proměnnou i mimo blok. Když vytváříte instanci v bloku, tak s blokem zaniká. Avšak stále se jedná o jedno místo v RAM. (ne větší, menší, ...) Pročež z hlediska všeho je to absolutně o ničem. Snad jen, že jakákoliv instance svou referenci ukládá, byť ji nenasměrujete na konkrétní proměnnou... Tedy trochu se to liší průběhem, grafem vytíženosti, přehledností, ... Ale asi nechápete, že v proměnné se ukládá jen reference  -> instance vzniká vždy na novém místě v haldě. (To ovlivnit nemůžete - tak funguje halda.) A tedy ukládat referenci 3x jinak - to je jako 3x jinak ukládat Int32/Int64 -> to je operace natolik prťavá...

Nahlásit jako SPAM
IP: 78.136.160.–
ondra
~ Anonymní uživatel
244 příspěvků
14. 10. 2015   #3
-
0
-

#2 Matěj Andrle
Díky za odpověď. Přesně to jsem chtěl slyšet.

Nahlásit jako SPAM
IP: 85.135.100.–
Matěj Andrle+1
Grafoman
14. 10. 2015   #4
-
0
-

#3 ondra
A chápete, že proměnná ukládá jen referenci? Místo v haldě se alokuje pokaždé jinde a vzniklý objekt je referencován. Jako v C/C++ se předávají adresy - ukazatele. Kdekoliv použijete "new" - tam se počne alokovat místo v haldě a ukládat adresa ukazující na toto místo. V (C)IL pak každé nenasměrované new se nasměruje do nějaké proměnné. A jak jsem psal - každá instance v bloku s blokem zaniká.

Nahlásit jako SPAM
IP: 78.136.160.–
Kit+15
Guru
14. 10. 2015   #5
-
0
-

#1 ondra
Příkaz 

Item item = new Item();

vytváří v systému dvě komponenty:

  • jakýsi ukazatel "item" na zásobníku, což je operace velmi rychlá
  • objekt "item" na haldě, který obsahuje data příslušného objektu.

Rozdíl mezi 1. a 2. zápisem je jen ten, že po opuštění cyklu ad 1. je zásobník čistý a proměnná item nedostupná, zatímco ad 2. se na zásobníku zachová proměnná item, která odkazuje na poslední vkládaný objekt. Záleží tedy pouze na tobě, zda ji potřebuješ i mimo cyklus.

Optimalizátor však v 1. případě často tu proměnnou vůbec nevytvoří, protože si vystačí s registry. První zápis je i o něco čistější - nemá skrytou funkčnost.

3. variantu jsem kdysi používal, ale stále častěji se jí vyhýbám z důvodu čitelnosti programu. Není z ní totiž patrné, co je argumentem metody items.Add() a často se kvůli tomu musí zbytečně dopisovat komentář. Také tímto způsobem často vznikají řádky delší než 80 znaků, které se pak musí (někdy komplikovaně) zalamovat, což na čitelnosti programu zrovna nepřidá.

Z hlediska výsledného kódu by měly být všechny tři varianty rovnocenné, preferuji tu první.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 46 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý