2010-10-16 15 views
5

Aktualnie przepisuję jeden z moich programów. Ma mocno rekurencyjną funkcję, która rozwiązuje PEG pasjansa:C: Który jest szybszy, dostęp do zmiennej globalnej lub przekazanie wskaźnika do funkcji

int solve(int draw) { 
    if (finished()) 
    return true; 

    //loop over every possible move (about 76 long values) 
    //do a move (access the board, which is a long value) 
    if (solve(draw + 1)) 
    return true; 

    return false; 
} 

więc zastanawiałem się, czy to szybciej korzystać rozwiązać tak:

solve(int draw, long **moves, long *board) {} 

Obecnie oba ruchy i płyta są zmienne globalne.

Oczywiście mam zamiar przetestować, ale jeśli ktoś powie mi, że ta próba nie będzie skuteczna, zaoszczędzę trochę czasu :).

pozdrawiam

+1

Pierwsza zasada optymalizacji polega na tym, że nie mówimy o optymalizacji. –

Odpowiedz

9

To prawdopodobnie nie będzie tak wydajny, ale jedynym sposobem, aby wiedzieć na pewno jest do profilowania kodu. Jeśli większość czasu twojego wykonania zostanie zużyta na twoją rzeczywistą logikę gry, to niewielka ilość narzutów umieszczających kilka argumentów na stosie powinna być nieistotna.

Jednak z punktu widzenia projektowania unikanie zmiennych globalnych jest znacznie lepsze. Pozwala to twojemu kodowi uzyskać status bezpaństwowca, a zatem potencjalnie ponownie wprowadzić go i bezpiecznie. Może to jednak nie być istotne dla Twojej aplikacji.

+1

Inną korzyścią dla uniknięcia globali jest to, że testowanie jednostkowe jest łatwiejsze. –

1

Istnieje pewne obciążenie związane z przekazywaniem parametrów do funkcji - zapisywanie parametrów do stosu. W większości (prawdopodobnie wszystkie) nowoczesnych architektur stosy i dostęp do danych globalnych mają tę samą prędkość, więc najprawdopodobniej przekazywanie parametrów będzie nieco wolniejsze.

+0

Istnieje kilka architektur, które przekazują argumenty funkcji w rejestrach procesora. Jednak związany wzrost wydajności jest eliminowany, jeśli używasz funkcji rekursywnie. –

2

To wygląda na optymalizację za wcześnie!

Za każdym razem, gdy wywołasz metodę solve(), musisz sprawdzić, czy wszystko jest gotowe(). Koszt sprawdzenia gotowego() wyniesie każdą różnicę w zmiennym czasie dostępu.

Najpierw uzyskaj poprawność, a następnie zrób profil, jeśli jest zbyt wolny, a następnie zoptymalizuj!

2

Nie sądzę, że jest to wąskie gardło wydajności.

Jedyną rzeczą, która przychodzi mi do głowy z kodem Ci pokazać to:

Czy trzeba long long zmienne? Zwykle potrzebują więcej miejsca, co oznacza więcej czasu na ich wykorzystanie. Pamiętam, że raz wymieniłem podwójne zmienne na zmienne zmiennoprzecinkowe i otrzymałem WIELKIE podwyższenie (o 50% krótszy czas wykonania). To może trochę pomóc :)

+0

Niestety tak, peg board może pomieścić 33 kołki, dlatego potrzebuję więcej niż 32 bitów :(. – imbaer

+0

Jestem prawie pewien, że 'long long' - jeśli mają być one traktowane jako 64-bitowe liczby całkowite - nie będą wolniejsze w nowoczesnych procesorach niż cokolwiek innego. –

Powiązane problemy