'파워빌더튜닝'에 해당되는 글 1건

  1. 2009.09.15 ♠ 파워빌더 성능관리
Powerbuilder2009. 9. 15. 15:42

♠ 파워빌더 성능관리

 

 

 1장. 개요

 

 

사용자와 개발자의 성능관점 차이

 

  사용자:

       성능이라는 것은 실행 시 시스템이 실행명령에 얼마나 빨리 응답하느냐는 것이다.

   개발자:

       성능은 다음과 같은 사항을 고려

            ▶ 서버의 부하

            ▶ 네트웍의 거리

            ▶ 사용자 수

            ▶ 클라이언트와 서버의 구성

            ▶ 데이타베이스 설계와 정규화

            ▶ 어플리케이션의 설계와 작성

            ▶ 사용자의 인지도

 

일반적인 성능 불만 사항

 

            ▶ 원도우를 열때

            ▶ 데이터 조회시

            ▶ 어플리케이션 실행시

            ▶ 필드간 이동시

            ▶ 윈도우 간 이동시

            ▶ 계속하여 실행시

* WIN98에서는 OS자체 버그로 에러발생 가능(펜타에서 ...)

 

어플리케이션 환경점검

 

   어플리케이션 문제인지 구성 문제인지?

   보다 더 성능이 뛰어난 기계에서 실행

   관련모듈을 클라이언트에 설치

 

설계 재점검

 

 

   잘못된 설계는 성능에 영향을 미치므로 기존 프로그램보다는 설계 변경이 효과적일 수도 있다.

 

시간측정

 

 long ll_start, ll_elapsed

  //시작 시간 지정

  ll_start = CPU()

  //측정할 과정 기술

  ...

  //경과 시간 계산

  ll_elapsed = CPU() - ll_start

 

부하를 이동하거나 분산

 

   긴 작업을 작은 단위로 나누면 동일하게 시간이 걸려도 사용자는 덜 지루함.

   모든 데이터를 조회 후 윈도우를 보여주는 것 보다는 윈도우를 먼저 보여주고 데이터를 가져와서 보여 주는 게 효과적.

   Open시 retrieve시키지 않는다.

   dw control의 contructor event에 스크립트를 넣지 않는다.

 

사용자에게 볼 것을 제공

 

   마우스 포인터의 모양 변경

   도움말(MicroHelp) 제공

   진행과정을 측정기로 보여줌

   취소할 수 있게

 

 

 

2장. 해당 실행 모듈 호출

 

 

윈도우가 나타나는 과정

 

   ▶ 클래스 풀에서 해당 모듈을 찾는다.

   ▶ 클래스가 풀에 없으면 라이브러리에서 찾는다.(지정한 순서대로)

   ▶ 윈도우를 생성

   ▶ 각종 컨트롤을 생성

   ▶ 관련된 메뉴를 만든다.

   ▶ 각 컨트롤의 constructor 이벤트

   ▶ 윈도우 open,activate,resize 이벤트

   ▶ 스크립에 있는 데이터 조회 수행

   ▶ 데이터윈도우에 지정된 기능 수행(sort,filter...)

 

탭 컨트롤

 

   CreateOnDemand 기능 사용(tabpage별 선택시 컨트롤을 만듦)

 

상속

 

   다단계 상속은 문제가 되지 않음(메뉴제외).

   상속은 관리나 실행시 이득.

 

클래스 풀(파워빌더에서 사용하는 메모리)

 

   클래스 정의는 클래스 풀에 저장.

   마지막 인스턴스가 종료되면 지워짐.

 

메뉴

 

   메뉴상속은 성능에 악영향(2~3단계)

   ChangeMenu() 사용금지

 

데이터 조회

 

   조건상 반드시 윈도우와 데이터를 동시에 보여 줄 경우에는 Retrieve As Needed 속성을 지정하고 Open 이벤트에서 Post된 이벤트에 다음과 같은 스크립틀 지정:

           dw_1.MODIFY('DataWindow.Retrieve.asneeded=no')

   한 화면의 데이터만 필요하다면 Retrieve As Needed 속성을 지정하고 Open 이벤트에서 Post된 이벤트에 다음과 같은 스크립트을 지정하고 그 후에 적당하게 Retrieve()함수를 수행

           dw_1.DBCancel()

   Open 이벤트는 데이터 조회 삼가.

   일반적으로 많이 사용되어지는 DDDW는 미리 조회하여 ShareData()함수를 사용하여 공유.

   사용자가 요청시에만 데이터 조회를 수행하는 것도 고려.

 

 

3장. 스크립 수행

 

 

스크립 수행

 

   문제점을 분리하기 위해 스크립을 코멘트화.

   긴 시간 수행 스크립은 POST.

   오브젝트 생성시 영향을 주는 이벤트.

       ▶ Open 이벤트

       ▶ Activate 이벤트

       ▶ 각 컨트롤의 Consructor 이벤트

       ▶ GetFocus 이벤트

       ▶ Show와 Resize 이벤트

   OpenWithParm()이나 OpenSheetWithParm()으로 윈도우 간에 데이터 교환시 스트럭춰를 사용하기 보다는 유저오브젝트를 사용.

 

머신코드로 컴파일

 

   장점:

         -.변수참조.

         -.수학적 계산이나 할당.

         -.로직을 전개하기 위한 IF, CHOOSE, FOR, DO 등의 문장

         -.함수 호출

         -.스크립에 관련된 사항만 향상

   제한 사항:

         -.해당모듈 호출

         -.데이터 윈도우 성능

         -.데이터 조회

            예:Retrieve() -  함수는 빠르게 호출되나 서버나 네트웍에는 영향을 미치지 못함

 

화면 재생성

 

   어떤 처리(조회,,,)시 SetRedraw()사용

 

속성지정

 

   컬럼 참조시 Dot Notation(.)을 가급적 자제한다.

   SetItem,GetItem()사용한다.(예:ll_id=dw_1.GetItemNumber(1,"emp_id")

 

데이터윈도우간 데이터 이동시 속도가 빠른 순서

 

   1.ShareData()

   2.RowsCopy(), RowsMove()

   3.직접지정:dw_1.object.date = dw_2.object.data

   4.GetItem()/SetItem() LOOP

 

루프

 

   이 방식보다는

        FOR li_index = 1  TO UpperBound(li_array)  //매번 UpperBound()를 수행한다

   이 방식이 유리

        int li_array_len

        li_array_len = UpperBound(li_array)

        FOR li_index = 1  TO li_array_len

 

동적배열

 

   1.정적배열이 유리하나 동적배열 사용시는 반대로 카운트한다.

      FOR li_index = 1  TO li_max

                  :

      NEXT

      보다는

      FOR li_index = li_max  TO  1  STEP -1

                  :      

      NEXT

      이 유리하다.(약20%향상)

   2.배열초기화

      int originarray[]

      int dummyarray[]

      originarray = dummyarray

   3.함수에서 배열을 교한 할 경우에는 Pass by reference나 Read Only사용

 

변수

 

   동일이벤트나 함수 내에서 변수 선언 장소는  문제되지 않음.

   Any 데이터 타입은 사용자제

 

함수

 

   해당 오브젝트에 포함하는 함수가 광역 함수보다 유리.

   지정과 미지정은 동일.

         wf_save()

         Parent.wf_save()

   성능비교(속도가 빠른 순위)

         -.정적이벤트와 정적함수

         -.TriggerEvent()함수

         -.동적함수

         -.동적 이벤트

 

고려할 그 외 사항

 

   단축 지정 문장이 유리.

   코멘트 삭제 - RetrieveRow,SystemError 이벤트에는 되도록 삭제.

   자주 발생하는 이벤트에는 되도록 짧게 작성(MouseMove,Other...).

   CHOOSE CASE와 IF / ELSEIF의 속도는 같다.

   오브젝트 참조시 ParentWindow()함수를 계속 사용하기 보다는 변수선언이 유리

 

 

4장. 데이터 조회

 

 

키와 인덱스

 

   자주사용하는 키는 인덱스를 지정 매월 자주 사용되는 킷값으로 데이터 정리

 

데이터베이스 연결 최소화

 

   Connect와 DisConnect를 적절히.

   SetTrans()보다는 SetTransObject()사용.

 

역정규화

 

   조인을 줄이기 위하여 역정규화.

   요약 정보 테이블 생성이 필요.

 

트랙잭션 관리

 

   COMMIT과 ROLLBACK을 적절히 사용하여 서버에서 잡고 있는 자원을 풀어 줌.

   Retrieve()만 한 경우도 서버의 자원을 잡고 있을 수 있음.

 

SQL문장은 단순하게

 

   WHERE 절의 LIKE와 Subquery 사용 절제.

   복잡한 질의를 단순하게 분리.

   복잡한 조인은 되도록 삼가.

   스크립트 내에 SQL을 삽입하기 보다는 데이터윈도우나 데이터스토어를 사용.

   RPC나 스토어프로시저를 사용.

 

조인 대신에 DDDW 사용

 

   DDDW를 과다하게 사용하면 성능 저하.

   항상 DDDW가 조인보다 빠른 것이 아님.

 

결과치

 

   보고서가 아닌 온라인 조회일 경우 100건 이상은 현실성 부족.

 

하드디스크에 데이터 저장

 

   Rows → Retrieve → Rows to Disk

 

디스플레이에 영향을 주는 것

 

   슬라이드 컬럼.

   AutoHeight 컬럼.

   bmp 참조시 EXE에 포함시키거나 폰트를 활용(Wingding...)

   그래프로 데이터표현 시 레이블을 회전시키지는 말 것.

 

조회 전 데이터윈도우와 테이블 비교

 

   파워빌더는 조회전 데이터윈도우에 정의된 정보와 테이블의 내용이 일치하는지 미리 조사한 후 조회

   ▷ DBParm 속성지정:

       결과치 비교 조사 취소:staticbind=1

 

 

5장. 그 외 사항

 

 

어플리케이션 성능 저하

 

   열었으면 닫아야 함

   생성했으면 제거도 하여야 함

   OpenUserObject()을 사용하였으면 CloseUserObject()도 기술

   OpenTab()을 사용하였으면 CloseTab()도 기술

   연결하였으면 연결 종료도 하여야 함.

   지역 참조 변수와 오브젝트를 사용 시 참조 불가 발생 금지

   자동 인스턴스화 된 오브젝트 제거

 

변수 선언 없이 생성

 

   변수 선언없이 유저오브젝트를 생성하지 말 것

              n_trans = CREATE n_trans

   문장 상으로 문제는 없으나 계속적으로 필요 없는 것이 생성됨.

 

어플리케이션 열기

 

   어플리케이션 시작 시에 다음에 필요한 작업을 하는 것도 고려 해볼만 함

         -.데이터베이스 연결 및 초기화

         -.코드 테이블 조회

         -.보안

   만약에 어프리케이션 여는 시간이 문제라면 메인윈도우에서 처리

 

데이타윈도우 컬럼 간 이동시 아래 사항 고려

 

   ItemChanged 이벤트

   ItemFocusChanged 이벤트

   RowFocusChanged 이벤트

   데이터 검증 룰

   계산 필드

   조건부 수행

 

DDDW가 늦게 열림

 

   각 DDDW가 각각 조회하는 것보다는 공유.

   pbm_dwndropdown 이벤트 점검.

 

윈도우 활성

 

   윈도우 활성이 늦으면 Activate,DeActivate 이벤트를 점검

          -.시간이 걸리는 데이터조회는 POST

          -.Active 이벤트에 메뉴 관련 로직은 삼가

 

라이브러리 관리

 

   대규모 어플리케이션인 경우 SetLibraryList()함수를 이용하여 라이브러리 찾는 순서를 변경하는 것도 고려.

   사용자에 따라 사용하는 부분이 다를 경우...

 

라이브러리 최적화

 

   한 라이브러리 오브젝트 개수는 50~60개.

   한 라이브러리의 크기는 800K.

   PBL의 조각난 부분을 최적화 하면 개발시 실행이 빠르고 하드디스크 공간을 작게 사용.

   재성성 후 최적화.

 

시스템 구성

 

   연장 메모리 사용.

   메모리 추가.

   디스크 케싱 사용.

   해상도가 높은 그림 사용시 속도 느림.

   낮은 해상도 사용.

   DOS환경파일 숙지(공백라인도 영향을 줌,autoexec.bat,config.sys).

   Windows환경 파일 숙지(공백라인도 영향을 줌,win.ini,system.ini).

   하드디스크 조각 모음을 정기적으로.

   하드드라이브의 속도와 디스크 분할 확인.

   파워빌더 실행모듈이 있는 디렉토리는 Path제일 처음 위치로.


Posted by Julyus