Przepraszam że double post, ale uznałem że dość ważne wniesienie do tematu:
Czy ktoś mógłby potwierdzić czy te testy mają jakąkolwiek wartość? Czytając oczywiście również podsumowanie.
1. TEST ZMIENNYCH AUTOMATYCZNYCH NA TYPIE WBUDOWANYM
#include <SFML/System.hpp>
#include <iostream>
#include <conio.h>
int main()
{
sf::Clock Clock;
int ILE = 100;
for( int j = 0; j < 100; j++ )
{
Clock.Reset();
for( int k = 0; k < 1000; k++ )
{
int * TabWsk;
TabWsk = new int[ ILE ];
for( int i = 0; i < ILE; i++ )
{
TabWsk[ i ] = 3;
};
}
std::cout << "AUTOMATYCZNE: Czas 1000 inicjalizacji = " << Clock.GetElapsedTime() << '\n';
}
_getch();
return 0;
}
Czasy są rzędu: 0,0014
2. TEST ZMIENNYCH DYNAMICZNYCH NA TYPIE WBUDOWANYM
#include <SFML/System.hpp>
#include <iostream>
#include <conio.h>
int main()
{
sf::Clock Clock;
int ILE = 100;
for( int j = 0; j < 100; j++ )
{
Clock.Reset();
for( int k = 0; k < 1000; k++ )
{
int ** TabWsk;
TabWsk = new int *[ ILE ];
for( int i = 0; i < ILE; i++ )
{
TabWsk[ i ] = new int( 3 );
};
}
std::cout << "WSKAZNIKI: Czas 1000 inicjalizacji = " << Clock.GetElapsedTime() << '\n';
}
_getch();
return 0;
}
Czasy są rzędu: 0,076
2.1 MAŁE WTRĄCENIE VECTORA
int main()
{
sf::Clock Clock;
int ILE = 100;
for( int j = 0; j < 100; j++ )
{
Clock.Reset();
for( int k = 0; k < 1000; k++ )
{
std::vector < int > TabWsk( ILE );
for( int i = 0; i < ILE; i++ )
{
TabWsk[ i ] = 3;
};
}
std::cout << "AUTOMATYCZNE: Czas 1000 inicjalizacji = " << Clock.GetElapsedTime() << '\n';
}
_getch();
return 0;
}
Daje czasy rzędu: 0.010
3. ZAMIAST WBUDOWANEGO OBIEKTU ZOSTANIE UŻYTY OBIEKT DEFINIOWANY PRZEZ UŻYTKOWNIKA O POSTACI:
class Obiekt
{
public:
Obiekt() { };
};
Dla wskaźników:
Czasy są rzędu: 0,079
Dla zmiennych automatycznych:
Czasy są rzędu: 0,0033
Jeśli chodzi o czas tworzenia, to zmienne automatyczne są faktycznie dużo szybsze. To rowiazuje mój problem.
3. ODWOŁANIE SIĘ PRZEZ WSKAŹNIK DO SKŁADNIKA KLASY
Obiekt * wsk = new Obiekt( 5 );
Obiekt * wsk2 = new Obiekt( 10 );
for( int j = 0; j < 100; j++ )
{
Clock.Reset();
for( int k = 0; k < 1000000; k++ )
{
wsk->a = wsk2->a;
}
std::cout << "WSKAZNIKI: Czas 1000000 inicjalizacji = " << Clock.GetElapsedTime() << '\n';
}
Czas: od 0.086 -> ~0.020
(zaczyna się od 0.086, potem systematycznie spada i utrzymuje się na poziomie 0.015 - 0.025;
4. ODWOŁANIE SIĘ PRZEZ OPERATOR WYŁUSKANIA DO SKŁADNIKA KLASY
Obiekt ob( 5 );
Obiekt ob2( 10 );
for( int j = 0; j < 100; j++ )
{
Clock.Reset();
for( int k = 0; k < 1000000; k++ )
{
ob.a = ob2.a;
}
std::cout << "OPERATOR WYL: Czas 1000000 inicjalizacji = " << Clock.GetElapsedTime() << '\n';
}
Czas: od 0.086 -> ~0.020
5. Podsumowanie.
Jeżeli jakaś zmienna, tablica czy obiekt definiowany przez użytkownika jest tworzony jedynie na potrzeby klasy to lepiej go zrobić automatyczną zmienną a nie wskaźnikiem. Wskaźniki używać dopiero przy przesyłaniu do funkcji. Czyli innymi słowy unikać operatora new.
Obiekt Ob1();
Obiekt * wsk = & Ob1;
To dużo lepszy pomysł niż
Obiekt * Ob1 = new Obiekt();
O jakieś 50 razy.
Nie wiem czy inni tak mają. Ale
ja wpadłem chyba w wskaśnikomanie, co tylko się dało robiłem jako dynamicznie, prawie każdy element klasy. To jest zła praktyka, dynamicznej alokacji należy używać tylko wtedy gdy ilość obiektów jest nieznana(lub zmienna) przez pewien czas pracy programu.
Operator new jest faktycznie wolny.
Może to co mówię jest oczywiste, jednak ja dopiero teraz zauważyłem jak dużą część kodu mam głupio zrobioną :P
Jeśli chodzi o odnoszenie się przez "." lub "->" nie wynika by któreś było szybsze.