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

Wywoływanie funkcji spowalnia program

Object Storage Arubacloud
+2 głosów
338 wizyt
pytanie zadane 9 lutego 2016 w C i C++ przez Paweł Głomski Obywatel (1,650 p.)
Pisząc grę ala Mario zrobiłem funkcję odpowiadającą za rysowanie mojej planszy. W argumentach funkcji znajdowała się tablica o wymiarach [20][300], oraz jeszcze kilka pojedynczych zmiennych o różnych typach. Wywoływanie tej funkcji w main'ie, sprawiało, że pętla główna gry nie dochodziła do 15 powtórzeń na sekundę. Przerzucenie całego kodu z funkcji do main'a sprawiło, że wszystko zaczęło chodzić kilkadziesiąt razy szybciej...  Rodzi się więc i pytanie: Dlaczego? Czy ciągłe tworzenie nowych zmiennych przez funkcję zajmuje tyle czasu, czy może jest jakiś inny powód?

Z góry dzięki za odpowiedzi.

3 odpowiedzi

+2 głosów
odpowiedź 12 lutego 2016 przez adrian17 Ekspert (345,160 p.)
wybrane 12 lutego 2016 przez Paweł Głomski
 
Najlepsza
Musiałbyś pokazać kod. Na razie jedynym moim strzałem jest że przypadkiem kopiujesz jakieś ciężkie obiekty przy wchodzeniu do funkcji.
komentarz 12 lutego 2016 przez Paweł Głomski Obywatel (1,650 p.)
edycja 12 lutego 2016 przez Paweł Głomski
struct Closest		
{
	Sprite closestLX ;	
	Sprite closestRX ;	
	Sprite bellow[2];	
};
struct Block
{
	bool collision = false;	
	bool isEmpty = true ;	
};
class Character
{
	int dmg;
	int drawFrameCount;	
	Texture rightTexture, leftTexture;	
	RectangleShape shape;
	float jumpFrameCount;	
	float walkFrameCount;
	float walkCounter;	
	int number;	
	Block map[mapYsize][mapXsize];
public:	
	Vector2f charSpawn;
	int hp;
	float speed;	
	int x;
	int y;
	int height;
	int width;
};

Closest drawMap(RenderWindow& window, Block map[][mapXsize], Texture texture, Sprite sprite, Character main)
{
       // cialo funkcji
}

 

komentarz 12 lutego 2016 przez adrian17 Ekspert (345,160 p.)
No i dobrze zgadłem - kopiujesz argumenty do funkcji, podczas gdy powinieneś je przekazywać przez referencję.
komentarz 12 lutego 2016 przez Paweł Głomski Obywatel (1,650 p.)
Czyli w takich funkcjach (często wywoływanych) najlepiej jest przekazywać argumenty przez referencję? W jakich przypadkach przekazuje się je wtedy "normalnie", skoro traci się wtedy czas na kopiowanie?
komentarz 12 lutego 2016 przez adrian17 Ekspert (345,160 p.)
Bardzo lekki obiekt (typ prosty lub mała struktura z dwoma-trzema typami prostymi) - kopia. Obiekt ciężki lub z kosztownymi konstruktorami kopiującymi -> const ref.

Dokładniej zapisane zalecenia:

https://raw.githubusercontent.com/isocpp/CppCoreGuidelines/master/param-passing-normal.png
0 głosów
odpowiedź 9 lutego 2016 przez RegularLemon Stary wyjadacz (12,280 p.)
Ciekawe pytanie :)

Możliwe, że czas wykonania jest związany z koniecznością alokowania nowych zmiennych w pamięci, a potem zwalniania tego miejsca. Chętnie zobaczę odpowiedź od jakiegoś C++ Ninja
0 głosów
odpowiedź 11 lutego 2016 przez Paweł Głomski Obywatel (1,650 p.)
Odświeżam, oraz liczę na bardziej konkretne odpowiedzi.
komentarz 11 lutego 2016 przez draghan VIP (106,230 p.)
W weekend (albo niedługo po), jak nie zapomnę, to postaram się odpowiedzieć. Teraz mam jeszcze egzaminy, nie mam czasu ani ochoty na pisanie porządnych odpowiedzi.

A w międzyczasie możesz wejść na IRC i podpytać o to adriana17, jeśli będzie miał chwilę czasu, na pewno Ci wyjaśni, o co chodzi. :)

Podobne pytania

0 głosów
1 odpowiedź 415 wizyt
pytanie zadane 1 września 2022 w JavaScript przez polandonion Mądrala (7,040 p.)
0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 8 grudnia 2021 w PHP przez BarSki13 Obywatel (1,250 p.)
0 głosów
1 odpowiedź 438 wizyt
pytanie zadane 22 czerwca 2020 w JavaScript przez Bartek12 Mądrala (5,510 p.)

92,628 zapytań

141,490 odpowiedzi

319,861 komentarzy

62,010 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...