• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Optymalizacja kodu - tworzenie obiektów, zagnieżdżone ify

0 głosów
852 wizyt
pytanie zadane 12 lutego 2017 w Java przez Ssslimer Nowicjusz (240 p.)

Cześć

Chciałbym poprosić was o porównanie dwóch sposobów na konstrukcje obiektów oraz zagnieżdżenie ifów. Próbuję napisać wydajniejszy kod i co do tych dwóch kwestii nie jestem pewien.

Niech przykładem będą te dwie prymitywne klasy. Czytałem, że jak tworzy się dużą ilość obiektów to wywoływanie super() może być mało wydajne zwłaszcza, gdy ustawiamy dla każdego obiektu taką samą zmienną statyczną.

public class Tree 
{
	protected static int size;
	
	public Tree(int size)
	{
		this.size = size;
	}
}

public class Maple extends Tree
{
	public Maple()
	{
		super(5);
	}
}

W drugim zestawie tych samych klas zastosowałem przypisanie wielkości klonu w bloku statycznym. Czy takie rozwiązanie jest lepsze? Nie spotkałem się osobiście by ktoś stosował coś takiego i stąd moja niepewność czy taki kod będzie wydajniejszy i działał tak samo jak ten z użyciem słowa kluczowego super.

public class Tree 
{
	protected static int size;
}

public class Maple extends Tree
{
	static
	{
		size = 5;
	}
}

 

Druga wątpliwość dotyczy zagnieżdżonych ifów, które właściwie można zredukować tylko do jednego. Czy zamiana kodu przyniesie korzyść, czy kompilator javy sam to jakoś uprości?

if(((point.x >= pointA.x && point.x <= pointB.x) || (point.x <= pointA.x && point.x >= pointB.x)) 
&& ((point.y >= pointA.y && point.y <= pointB.y) || (point.y <= pointA.y && point.y >= pointB.y))
&& ((point.z >= pointA.z && point.z <= pointB.z) || (point.z <= pointA.z && point.z >= pointB.z)))
{		
	return point;
}
			
if((point.x >= pointA.x && point.x <= pointB.x) || (point.x <= pointA.x && point.x >= pointB.x))
{
	if((point.y >= pointA.y && point.y <= pointB.y) || (point.y <= pointA.y && point.y >= pointB.y))
	{
		if((point.z >= pointA.z && point.z <= pointB.z) || (point.z <= pointA.z && point.z >= pointB.z))
		{
			return point;
		}
	}
}

Dziękuję z góry za pomoc.

1
komentarz 12 lutego 2017 przez Porcupine Nałogowiec (31,560 p.)

Skomentuje, trochę odbiegając od tematu. Nie wiem czy są różnice wydajnościowe pomiędzy powyższymi przykładami, lecz prawdopodobnie nawet jeżeli istnieją są pomijalne.

Wydaje mi się, że jednak inne aspekty po za czystą wydajnością są ważniejsze, także: 

W pierwszym przykładzie w ogóle nie trzymałbym zmiennej size jako zmiennej statycznej, gdyż jest to mało obiektowe, a bardziej imperatywne podejście, które nie cechuje dobre designu.

W drugim przykładzie proponowałbym napisanie metody w klasie Point służącej do porównywania dwóch obiektów np. o sygnaturze:

int compare(Point other) { ... } 

 

komentarz 15 lutego 2017 przez Ssslimer Nowicjusz (240 p.)

Dzięki, nawet nie zauważyłem że ten kod w kilku miejscach używam, faktycznie lepiej metodę zrobić osobną.

Nie bardzo rozumiem dlaczego zmienna size nie mogłaby być statyczna, bo jeśli miałbym kilka klas odnoszących się do różnych gatunków drzew i chciałbym by różne gatunki miały zawsze konkretną wielkość to wydaje mnie się, że tak będzie najlepiej.

1 odpowiedź

0 głosów
odpowiedź 12 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)

"zwłaszcza, gdy ustawiamy dla każdego obiektu taką samą zmienną statyczną"

Zmienne statyczne ustawia się raz i są dostepne dla każdego obiektu. Wiec nie ma potrzeby inicializować tej zmiennej n razy gdy mamy n obiektów.

Kod z blokiem static zainicializuje Ci tą zmienną raz na początku działania programu gdy klasa bedzie ładowana przez class loadera.

Co do zagnieżdżonych ifów, To taki troche potworek programistyczny i raczej nie najlepsza praktyka. Ale wydaje mi się że pojedynczy if bedzie o tyle lepszy że sprawdzanie wykonuje się tylko do momentu w którym dana wartość logiczna jest pewna. I nie trzeba wywoływać dodatkowych ifów. Choć nie wydaje mi się aby miało to wielkie znaczenie i raczej nie wydaje mi się aby zaprzątać sobie głowy wydajnoscią na tak niskim poziomie. Twój kod ma być przedewszystkim czytelny.

komentarz 15 lutego 2017 przez Ssslimer Nowicjusz (240 p.)
Rozwiałeś moje wątpliwości, jakbym tworzył tysiące lub miliony obiektów to zaoszczędzę pamięci.

Zdaję sobie sprawę, że optymalizacja na takim niskim poziomie mało przyniesie i nie chcę też wpadać w paranoję optymalizowania, ale skoro czasami można małym kosztem poprawić jakoś wydajność to czemu nie.

Podobne pytania

0 głosów
1 odpowiedź 477 wizyt
pytanie zadane 30 kwietnia 2015 w C i C++ przez Rafajah Bywalec (2,090 p.)
0 głosów
1 odpowiedź 435 wizyt
0 głosów
1 odpowiedź 385 wizyt
pytanie zadane 21 stycznia 2022 w C i C++ przez BKantur Nowicjusz (160 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,323 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...