Napisane przez: changs | 24 stycznia, 2007

Używanie rejestru procesora w C++.

Jeśli jesteś programistą C++ i nie znasz specyfikatora ‘register’ to myślę, że warto go poznać.

Dodany do definicji obiektu ( int ) prosi kompilator o to aby umieścił dany obiekt w rejestrze procesora a nie tak jak to się dzieje zwykle do komórki pamięci.

 

Co to nam daje?
Dostęp do danych zawartych w rejestrach jest prawie natychmiastowy, podczas gdy dostęp do komórek w pamięci RAM trwa stosunkowo długo.

 

Dlaczego napisałem, że dodając specyfikator register jedynie prosimy o to aby kompilator umieścił dany obiekt w rejestrze?
Ponieważ nie ma gwarancji, że kompilator umieści tam nasz obiekt lecz tylko spore prawdopodobieństwo.

Kiedy stosować?
Wtedy kiedy wiemy, że będziemy korzystać z danego obiektu bardzo wiele razy. Dzięki temu nasz program będzie się wykonywać trochę, a czasami dużo szybciej.

Kiedy nie stosować?
Gdy będziemy chcieli znać adres danego obiektu. Rejestr adresuje się inaczej niż komórki pamięci RAM. Gdy o tym zapomnimy kompilator zignoruje naszą prośbę o umieszczenie obiektu w rejestrze.

Pamiętaj także, żeby używać tego specyfikatora dosyć rozważnie. Pamięć procesora nie jest duża więc nie przesadzaj z umieszczaniem tam wszystkich obiektów.

 

Na zachętę zrobiłem mały test aby pokazać Wam, że czasami bardzo opłaca się pamiętać o rejestrze.

Program standardowy.

#include <iostream>
using namespace std;

int main()

{
int a = 1;
unsigned int b = 4294967295;

while (b)
{
a = 100 * a * a * b * b / b / a * 2 - 20 + b * b * a;

--b;
 }
return 0;
 }

Ten sam program ale wykorzystujący rejestr to przechowywania 2 obiektów.

#include <iostream> 
using namespace std;
int main()
 {
 register int a = 1;
 register unsigned int b = 4294967295;
while (b)
 {
 a = 100 * a * a * b * b / b / a * 2 - 20 + b * b * a;
-–b;
 }
 return 0;
}

W tym przypadku wzrost wydajności jest bardzo duży. Program pierwszy wykonuje się u mnie przez 229 sekund podczas gdy drugi program wykonuje się zaledwie 13 sekund!

Screen:

Free Image Hosting at www.ImageShack.us

Zobacz także: http://pl.wikipedia.org/wiki/Rejestr_procesora


Odpowiedzi

  1. Mała uwaga co do „unsigned int b = 4294967295;” . Rozumiem, że liczba ta to zasięg unsigned int.
    Zależy on jednak od procesora na którym kompiluje się program. W większości wypadków będzie to właśnie taka liczba, ale nie zawsze. W C (w C++ pewnie jakoś podobnie) dołącza się a liczbę zastępuje się makrem ULONG_MAX . Warto o tym pamiętać 🙂

  2. WordPress wywali część mojego komentarza (wziął go za taga html). Powinno być: […] jakoś podobnie) dołącza się < limits.h >

  3. Tak, ale w tym przypadku to nie jest ważne. To tylko liczba powtórzeń pętli, którą lepiej mieć zawsze taką samą a nie domyślać się ile razy wykonała się pętla na podstawie procesora 🙂

  4. MAAF NUMPANG IKLANnTERIMA PANGGILANnLES PRIVATE KOMPUTER dan SERVICE KOMPUTERnANTON DI 08159938717 / 02193717042n( TIDAK SMS ! Click https://twitter.com/moooker1


Dodaj komentarz

Kategorie