Napiszmy krótki kawałek kodu, który wykonuje niezbyt sensowne obliczenia korzystając z wbudowanych funkcji matematycznych. Kod zostanie wykonany na serwerze Exadata
DECLARE
vn_Pom NUMBER :=0;
vn_Start NUMBER;
BEGIN
vn_Start := dbms_utility.get_time;
vn_Pom := 1.2;
FOR EL IN 1..100000
LOOP
vn_Pom := COS(SIN(vn_Pom));
vn_Pom :=1+ vn_Pom + POWER(2, vn_Pom);
vn_Pom := LOG(2, ABS(vn_Pom) + 3);
END LOOP;
dbms_output.put_line( ROUND( (dbms_utility.get_time- vn_start)/100, 2 ) || ' sekund...' );
END;
Średni czas wykonania dla trzech przebiegów to 9,02 sekundy.
Zmieńmy teraz jedną podkreśloną linię w powyższym anonimowym bloku kodu.
vn_Pom BINARY_DOUBLE :=0;
Średni czas wykonania zmniejszył się do 0,06 sekundy.
Skąd wynika ta zmiana??
W pierwszym przypadku typ NUMBER jest uniwersalny i niezależny od maszyny. Jest obsługiwany za pomocą dołączonym bibliotek napisanych w C i na każdym serwerze dla jednakowych operacji powinny być zwracane jednakowe wartości. Bardzo czasochłonne są funkcje matematyczne wykorzystujące prawdopodobnie rozwinięcie w szereg funkcji trygonometrycznych, co jest dość zasobożerne. Ale zawsze otrzymamy ten sam wynik !!! Jest to cecha niezwykle istotna w przypadku rozproszonych systemów transakcyjnych korzystających z niejednorodnej infrastruktury sprzętowej. Jest to emulacja niezależna od typu serwera.
Natomiast w drugim przypadku deklaracja zmiennej vn_Pom BINARY_DOUBLE :=0 informuje serwer, że obliczenia będą przeprowadzone przy wykorzystaniu koprocesora matematycznego w obrębie procesora serwera. To odpowiednik typu double w C przy wykorzystaniu koprocesora. Jet to rozwiązanie bardzo szybkie, tym niemniej zachodzi uzasadniona obawa, ze dla rożnych platform sprzętowych, wyniki obliczeń będą się różnić ostatnimi cyframi. Należy tez zauważyć, że koprocesory nie obsługują wartości NULL, która to jest wysokopoziomowym wynalazkiem, stąd przymusowa inicjalizacja zmiennej. Ma to też swoją zaletę - taki kod na etapie testowania zawsze będzie generować wyjątki, kiedy napotka wartość NULL i ułatwi wykrycie miejsc, skąd przechodzą wartości niezainicjalizowane..
Brak komentarzy:
Prześlij komentarz