Efektivni promenne. – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Efektivni promenne. – C / C++ – Fórum – Programujte.comEfektivni promenne. – C / C++ – Fórum – Programujte.com

 

LukAss7410
Newbie
9. 1. 2011   #1
-
0
-

Nevím přesně, jak kód hardwarově pracuje a vždy mi vrtalo hlavou, jestli vytvářet proměnné před cyklem nebo až v něm. Například:

int i = 0;

while(i < 100)
{
int abc = i *2;
if (méně často volaná podmínka)
{
int def = i *10;
}
i++;
}

nebo:
int abc;

int def;
int i = 0;
while(i < 100)
{
abc = i *2;
if (méně často volaná podmínka)
{
def = i *10;
}
i++;
}

V tomhle případě samozřejmě už s proměnnýma po cyklu nebudu dále pracovat.
Děkuju.

Nahlásit jako SPAM
IP: 213.220.223.–
voty
~ Anonymní uživatel
56 příspěvků
10. 1. 2011   #2
-
0
-

To LukAss741 : Teoreticky pracuje rychleji ten druhý případ, neboť není potřeba proměnné "vytvářet" a "rušit" při každém vstupu do cyklu. Nicméně osobně bych doporučil 1. řešení, neboť je milé, že proměnné již nejsou po skončení cyklu platné a nehrozí, že se budou plést s jinými proměnnými o nějaký kus dále. Krom toho, pokud jde o rychlost, tak předpokládám zapnuté optimalizace kompilátoru, který si to stejně zoptimalizuje tak, jak uzná za vhodné. Nesnažte se dělat optimalizace, které za vás může dělat někdo jiný.

Nahlásit jako SPAM
IP: 81.19.47.–
LukAss7410
Newbie
10. 1. 2011   #3
-
0
-

A konkrétně v případě, kdy celý program je nekonečný cyklus, který neustále čte memory address?

Nahlásit jako SPAM
IP: 213.220.223.–
voty+1
Návštěvník
10. 1. 2011   #4
-
0
-

To LukAss741 : IMHO je to úplně jedno, pokud jsou zapnuty optimalizace překladače. Ty proměnné v cyklu, pokud nejsou nikde dále potřeba a jsou určeny pouze pro to vyhodnocení podmínky, budou s největší pravděpodobností přeloženy pouze na hrátky mezi registry procesoru.
A pokud tě ale opravdu _hodně_ trápí, která metoda bude ta úplně nejrychlejší, pak nezbývá nic jiného, než si to ověřit měřením. Skutečně a nekecám.

Nahlásit jako SPAM
IP: 81.19.47.–
Jednu rozbil a tu druhou ztratil.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
10. 1. 2011   #5
-
0
-

To voty : rychlejsi je vytvorit si promenne predem, ale ze by to bylo znatelne lepsi to urcite ne

Nahlásit jako SPAM
IP: 82.99.180.–
KIIV
~ Moderátor
+43
God of flame
10. 1. 2011   #6
-
0
-

jedina vyjimka by bylo mit treba strlen(retezec) ... pred cyklem a v nem.. to uz je jiny kafe

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
voty+1
Návštěvník
12. 1. 2011   #7
-
0
-

To Anonymní uživatel :

No tak jo, zkusil jsem jednoduchý test.

Následující kód je označen jak Out-Loop.



#include <cstdio>

int main()
{
int a = 0;
int b;
int c;
int d;
int e;

while(a < 1000000000)
{
b = a + 1;
c = b * a;
d = c + b - a;
e = a - d + c;

if(e == 42)
{
printf("%i\n", e);
}
++a;
}
}


Následující kód je označen jak In-Loop.


#include <cstdio>

int main()
{
int a = 0;

while(a < 1000000000)
{
int b = a + 1;
int c = b * a;
int d = c + b - a;
int e = a - d + c;

if(e == 42)
{
printf("%i\n", e);
}
++a;
}
}


Měřil jsem přes příkaz time, brána hodnota user (čas, který program strávil během v userspace, udáváno v sekundách), překládáno pomocí gcc 4.45 x86_64-gnu-linux bez optimalizací (-O0) a s optimalizacemi (-O3). Zde jsou výsledky.



Out-Loop -O0
8.41, 8.33, 8.40, 8.26, 8.38

In-Loop -O0
8.31, 7.96, 8.05, 8.40, 8.33

Out-Loop -O3
0.84, 0.84, 0.86, 0.85, 0.85

In-Loop -O3
0.83, 0.85, 0.86, 0.87, 0.84


Bez optimalizací je paradoxně o fous rychlejší In-Loop varianta. S optimalizacemi je úplně jedno, až na to, že vykonávání je o řád rychlejší oproti variantě bez optimalizací.

Nahlásit jako SPAM
IP: 81.19.47.–
Jednu rozbil a tu druhou ztratil.
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, 73 hostů

Moderátoři diskuze

 

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