[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Hermetyzacja w PROGRESS-ie.
Albo ja czegos nie rozumiem, albo popelnil Pan blad podstawowy ;-)
Jak wygladalo samo testowanie wydajnosci?
Wersja A: prawidlowo
====================
def var phand as handle.
def var i as int.
run a_tbl.p persistent set phand.
do i = 1 to 5000:
run fnd in phand (buffer _File, 0).
end.
delete procedure phand.
Wersja B: nieprawidlowo
=======================
def var phand as handle.
def var i as int.
do i = 1 to 5000:
run a_tbl.p persistent set phand.
run fnd in phand (buffer _File, 0).
delete procedure phand.
end.
Pozdrawiam!
Tomasz Judycki
Textus Virtualis Sp. z o.o.
Szaserów 3
04-293 Warszawa
tel/fax (48 22) 879 82 00
http://www.tv.com.pl
Bogdan Brzozowski wrote:
>
> Bogdan Brzozowski wrote:
> > Można to osiągnąć
> > poprzez stworzenie instancji procedury zewnętrznej
> > poleceniem RUN PERSISTENT, a następnie używając procedur
> > wewnętrznych [ciach] Jest to rzeczywiście
> > proteza. Program tak napisany będzie działał ok. 2,5 raza
> > wolniej przy wielokrotnym tworzeniu i niszczeniu instancji
> > procedury zewnętrznej, niż program który takiej instancji
> > nie tworzy [ciach]
>
> Tomasz Judycki odpowiedział:
> Przeciez procedury persistent nie zostaly po to wymyslone!
> Procedure uruchamia sie raz w trybie persistent przy uruchomieniu
> aplikacji i dzieki temu ma sie stale w pamieci operacyjnej dostepne
> procedury wewnetrzne. A przy zakonczeniu dzialania aplikacji
> likwidujemy instancje procedury. Takie podejscie bedzie
> szybsze niz wielokrotne uruchamianie procedury
> z pliku zewnetrznego.
>
> Panie Tomaszu,
> Problem przedstawiłem bardzo pobieżnie. Teraz go sprecyzuję.
> Chodziło mi o próbę obiektowego podejścia do pisania
> transakcji w PROGRESS-ie. Procedura zewnętrzna miała
> pełnić rolę klasy. Zmienne zadeklarowane w jej bloku
> głównym - rolę prywatnych atrybutów tej klasy, natomiast
> procedury wewnętrzne - rolę metod. Jeżeli metodami takiej
> "klasy" chciałbym przetwarzać dużą ilość rekordów i nie
> likwidowałbym instancji "obiektów - procedur zewn."
> (czyli instancji moich "klas"), wówczas miałbym pamięć
> zajętą setkimi lub tysiącami niepotrzebnych mi już instancji.
> Przeprowadzony przeze mnie test polegał na wywołaniu po
> 5 000 razy różnych metod: fnd, ins, upd wewnątrz
> instancji "procedury-klasy", którą zamieszczę poniżej
> (i jeżeli starczy Panu cierpliwości - proszę na nią spojrzeć).
> Tabela tymczasowa ttTbl służy do przekazywania parametrów
> pomiędzy metodami "klasy" a zewnętrznymi procedurami
> tworzącymi i niszczącymi instancje klasy. Takie podejście
> musiałem odrzucić ze względu na wydajność (ok. 2,5 raza gorszą,
> niż w przypadku wywoływania "zwykłych" procedur
> zewnętrznych realizujących to samo, co metody: fnd,
> ins, upd). Trochę tego żałuję, ponieważ dzięki tak
> uzyskanej hermetyzacji miałbym w sposób bardziej
> naturalny zapewnioną częściową zgodność pomiędzy kodem
> źródłowym i projektem aplikacji stworzonym za pomocą
> standardu projektowania obiektowego, jakim jest UML.
> Jeżeli w przedstawionym przeze mnie podejściu popełniłem
> jakieś błędy, lub Pan i inni korespodenci listy macie pomysły,
> aby jednak taką hermetyzację uzyskać (bez utraty wydajności)
> - jestem tym bardzo zainteresowany.
> Zgadzam się z Panem Tomaszem, że polecenie run persistent
> daje inne, cenne możliwości.
>
> Pozdrawiam
>
> Bogdan Brzozowski
>
> /* pseudoklasa w formie
> proc. zewn. a_tbl.p */
>
> /* atrybuty klasy-tabeli */
> def buffer bA_tbl for a_tbl.
>
> /* do komunikacji z inerfejsem uzytkownika */
> def temp-table ttTbl like a_tbl.
>
> /* szukaj rekordu */
> procedure fnd:
> def input param iiKeyForFind as int no-undo.
> def param buffer bttTblp for ttTbl.
> def var vcRetp as char init "NOT-OK".
>
> proc:
> do on error undo, leave proc
> on stop undo, leave proc:
>
> case iiKeyForFind:
> when 0 then
> find bA_tbl
> where bA_tbl.tbl_id = bttTblp.tbl_id no-error.
>
> when 1 then
> find bA_tbl
> where bA_tbl.tbl_name = bttTblp.tbl_name no-error.
> end case.
> if locked(bA_tbl) then
> undo, leave proc.
>
> if not available(bA_tbl) then
> undo, leave proc.
>
> vcRetp = "OK".
> end.
> return vcRetp.
> end procedure.
>
> /* dopisz nowy rekord */
> procedure ins:
> def param buffer bttTblp for ttTbl.
> def var vcRetp as char init "NOT-OK".
>
> proc:
> do on error undo, leave proc
> on stop undo, leave proc:
> create bA_tbl.
>
> run upd(buffer bttTblp).
> if return-value <> "OK" then
> undo, leave proc.
>
> vcRetp = "OK".
> end.
> return vcRetp.
> end procedure.
>
> /* zapis do istniejacego rekordu */
> procedure upd:
> def param buffer bttTblp for ttTbl.
> def var vcRetp as char init "NOT-OK".
>
> proc:
> do on error undo, leave proc
> on stop undo, leave proc:
> if not available(bA_tbl) then do:
> run fnd(input 0,
> buffer bttTblp) .
> if return-value <> "OK" then
> undo, leave proc.
> end.
>
> bA_tbl.tbl_name = bttTblp.tbl_name.
>
> vcRetp = "OK".
> end.
> return vcRetp.
> end procedure.
>
> /* usun rekord */
> procedure kill:
> def param buffer bttTblp for ttTbl.
> def var vcRetp as char init "NOT-OK".
>
> proc:
> do on error undo, leave proc
> on stop undo, leave proc:
> if not available(bA_tbl) then do:
> run fnd(input 0,
> buffer bttTblp) .
> if return-value <> "OK" then
> undo, leave proc.
> end.
>
> delete bA_tbl.
>
> vcRetp = "OK".
> end.
> return vcRetp.
> end procedure.
>
> /* zwroc rekord w tabeli tymczasowej */
> procedure ret :
> def param buffer bttTblp for ttTbl.
> def var vcRetp as char init "NOT-OK".
>
> proc:
> do on error undo, leave proc
> on stop undo, leave proc:
> if not available(bA_tbl) then do:
> run fnd(input 0,
> buffer bttTblp) .
> if return-value <> "OK" then
> undo, leave proc.
> end.
>
> buffer-copy bA_tbl to bttTblp.
>
> vcRetp = "OK".
> end.
> return vcRetp.
>
> end procedure.
>
> ------
> Strona WWW: http://pluton.pol.lublin.pl/pugpl/index.htm
> Obsluga listy: listserv@zeto.bydgoszcz.pl
> Archiwum listy: http://www.zeto.bydgoszcz.pl/progress/index.html
> ------
--
------
Strona WWW: http://pluton.pol.lublin.pl/pugpl/index.htm
Obsluga listy: listserv@zeto.bydgoszcz.pl
Archiwum listy: http://www.zeto.bydgoszcz.pl/progress/index.html
------