BINARY_DOUBLE
bzw. BINARY_FLOAT
und die Vermeidung von impliziter Typ-Konvertierung.Als Beispiel dient das Wallis-Produkt zur Berechnung der Kreiszahl Pi. Die Berechnung erfolgt durch den folgenden anonymen PL/SQL-Block:
declare v_pi binary_double := 1.0; begin for i in 1 .. 1000000 loop v_pi := v_pi * (1.0 + (1.0 / (4.0 * i * i - 1.0))); end loop; v_pi := v_pi * 2.0; dbms_output.put_line(v_pi); end; / 3,1415918681921307E+000 PL/SQL-Prozedur erfolgreich abgeschlossen. Abgelaufen: 00:00:05.07Die Berechnung dauert ungefähr fünf Sekunden und gibt die Zahl Pi bis auf fünf Stellen genau an. Doch an welcher Stelle befindet sich nun das Optimierungspotenzial?
Literale vom Typ
BINARY_DOUBLE
bzw. BINARY_FLOAT
enthalten den Buchstaben d
(D
) bzw. f
(F
). Ansonsten handelt es sich um Literale vom Typ NUMBER
, die im vorherigen PL/SQL-Block zur Typ-Konvertierung geführt haben.Der angepasste PL/SQL-Block sieht dann wie folgt aus:
declare v_pi binary_double := 1.0d; begin for i in 1 .. 1000000 loop v_pi := v_pi * (1.0d + (1.0d / (4.0d * i * i - 1.0d))); end loop; v_pi := v_pi * 2.0d; dbms_output.put_line(v_pi); end; / 3,1415918681921489E+000 PL/SQL-Prozedur erfolgreich abgeschlossen. Abgelaufen: 00:00:00.46Jetzt reduziert sich die Dauer der Berechnung deutlich auf unter eine Sekunde.
Also sollte man bei der Verwendung von
BINARY_DOUBLE
bzw. BINARY_FLOAT
stets auf die korrekte Angabe von Literalen achten.
Keine Kommentare:
Kommentar veröffentlichen