[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Hermetyzacja w PROGRESS-ie.



	Witam,

	Z punktu widzenia metody fnd na pewno rozwiązanie A
jest bardziej wydajne, niż rozwiązanie B. Jednakże w moim
teście nie chodziło mi o wyszukiwanie rekordów w tak
skomplikowany sposób, tylko o sprawdzenie wydajności
tworzenia i usuwania instancji procedur typu persistent.
Proszę zauważyć, że w rozwiązaniu A każda kolejna iteracja
wywołuje metodę fnd do instancji z iteracji POPRZEDNIEJ,
a zatem atrybuty obiektu-tabeli w buforze bA_tbl są atrybutami
obiektu z iteracji poprzedniej. W programowaniu obiektowym
częściej istnieje potrzeba powoływania do życia nowych obiektów
celem wykonania na nich pwenych operacji, a następnie
ich zniszczenie, dlatego mój test zrealizowałem przy pomocy
rozwiązania B.
	Intuicja podpowiada mi, że być może brnę w ślepy zaułek,
ponieważ PROGRESS nie stworzył polecenia RUN PERSISTENT
do hermetyzacji zmiennych (i tak, jak w podanym przeze mnie
przykładzie - buforów) zadeklarowanych w bloku głównym
wywoływanych w ten sposób procedur, lecz gdybym się mylił,
byłaby to, moim zdaniem, bardzo przyjemna i pożyteczna cecha
języka, ułatwiająca pracę grupową nad oprogramowaniem.


Pozdrawiam i dziękuję za zainteresowanie tematem.
-
Bogdan Brzozowski

-----Original Message-----
From: owner-progress@zeto.bydgoszcz.pl
[mailto:owner-progress@zeto.bydgoszcz.pl]On Behalf Of Tomasz Judycki
Sent: Friday, January 11, 2002 1:34 AM
To: progress@zeto.bydgoszcz.pl
Subject: 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

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
------

------
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
------