如何優(yōu)化你的PowerBuilder程序_第1頁
如何優(yōu)化你的PowerBuilder程序_第2頁
如何優(yōu)化你的PowerBuilder程序_第3頁
如何優(yōu)化你的PowerBuilder程序_第4頁
如何優(yōu)化你的PowerBuilder程序_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、如何優(yōu)化你的PowerBuilder程序PowerBuilder是快速有效的開發(fā)工具,在程序?qū)崿F(xiàn)過程靈活多樣,下面介紹一下在開發(fā)高校產(chǎn)品過程中積累的一些經(jīng)驗(yàn)。一、處理 SQL 語句1、緩沖 SQL 語句        在應(yīng)用程序中,有時(shí)需要反復(fù)調(diào)用同一組 SQL語句,在這種情況下,可以通過在應(yīng)用中為這些 SQL 建立緩沖區(qū)來提高執(zhí)行性能。         &

2、#160; 在缺省情況下,SQL 語句的緩沖區(qū)是關(guān)閉的,你可以通過如下語句打開它:                            SQLCACHE = n          

3、;n 表示裝入緩沖區(qū)的 SQL 語句數(shù)量(缺省為0)。    例如:   dw_1.SetTransObject(sqlca)    SQLCA.dbParm = "SQLCache = 0"    dw_1.retrieve()        如果將上例的 "

4、;SQLCache = 0" 改為 "SQLCache = 25",此句的執(zhí)行效率將提高五分之一左右。但應(yīng)注意緩沖區(qū)的大小,否則也將影響程序執(zhí)行的性能。    注:此方法對用 ODBC 和 orACLE 連接的數(shù)據(jù)庫非常有效。2、捆綁變量    請看下例:   SQLCA.DBPARM = "DISABLEBIND=1"

5、;    Insert INTO DA_DH valueS("1","河南0")    Insert INTO DA_DH valueS("2","河南1")    Insert INTO DA_DH valueS("3","河南2")   

6、; Insert INTO DA_DH valueS("4","河南3")    Insert INTO DA_DH valueS("5","河南4")    Insert INTO DA_DH valueS("6","河南5")      

7、;  這里未使用捆綁變量,在插入是 PB 將重新處理每個(gè)帶有    新值的SQL語句。如果將上例改為:    SQLCA.DBPARM = "DISABLEBIND=0"    Insert INTO DA_DH valueS("1","河南0")    Insert INTO&

8、#160;DA_DH valueS("2","河南1")    Insert INTO DA_DH valueS("3","河南2")    Insert INTO DA_DH valueS("4","河南3")    Insert INTO DA_DH va

9、lueS("5","河南4")    Insert INTO DA_DH valueS("6","河南5")    則系統(tǒng)將把 Insert 語句按如下格式進(jìn)行處理:        Insert INTO DA_DH valueS(?,?)   &#

10、160;其中 "?" 稱為占位符。系統(tǒng)性能將有所增強(qiáng)。3、用數(shù)據(jù)窗口代替 SQL 語句通常,為了獲得某些數(shù)據(jù),采用數(shù)據(jù)窗口和 SQL 語句都是可行的,但是PB 對數(shù)據(jù)窗口和 SQL 語句采用不同的處理機(jī)制,因此,具有不同的效率。例:為里檢索電話檔案中的用戶名,可以利用 SQL 語句,將所有的數(shù)據(jù)檢索到一個(gè)多行編輯中,也可以檢索到一個(gè)數(shù)據(jù)窗口中。如果使用第一中方法:首先定義一個(gè)游標(biāo):    DECLARE CUR

11、60;CURSOR FOR    Select "DA_DH"."HM"    FROM "DA_DH"然后可以:    STRING stxt,st    int li        open cur   &

12、#160;do li = li + 1        fetch cur        into :stxtli         st=st+stxtli + "rn"    loop wh

13、ile stxtli""    close cur;    mle_1.txt = st也可以使用第二種方法:    dw_1.settransobject(sqlca)    dw_1.retrieve()    利用 POWERBUILDER PROFILER 工具進(jìn)行檢查,對比兩種方法所需時(shí)間如下方法&

14、#160;                    所需時(shí)間 (百分之一秒)SQL 語句   100.9857數(shù)據(jù)窗口              49.0133由于數(shù)據(jù)窗口或DATASTORE 使用了標(biāo)

15、準(zhǔn)的內(nèi)嵌的代碼,而不是有開發(fā)人員進(jìn)行全部編碼,同時(shí)編譯執(zhí)行的速度比解釋執(zhí)行的速度快的多,因此在開發(fā)過程中應(yīng)盡量使用數(shù)據(jù)窗口和DATASTORE.    即使是必須用SQL 語句的時(shí)候,也應(yīng)該盡量將它們定義為存儲過程(特別是在多用戶的環(huán)境中),以提高應(yīng)用程序的性能.二、數(shù)據(jù)窗口的編程和執(zhí)行數(shù)據(jù)窗口是PB最值得被稱道的, 其具有如下特點(diǎn):1. 多種顯示方式.2. 多種編輯方式.3. 使用方法簡單.4. 具有多種報(bào)表形式.5. 可實(shí)現(xiàn)屏幕滾動.6. 可實(shí)現(xiàn)數(shù)據(jù)的有效性校驗(yàn).7.&#

16、160;執(zhí)行性能顯著提高.8. 編程工作變少.9. 可以在數(shù)據(jù)窗口內(nèi)部實(shí)現(xiàn)數(shù)據(jù)哭的更新.下面, 我將介紹一些用于提高數(shù)據(jù)窗口性能的技術(shù).1. 減少連接數(shù)據(jù)庫的次數(shù)連庫操作是非常影響執(zhí)行速度的操作. 因此在程序中,一旦與數(shù)據(jù)庫連接后就應(yīng)當(dāng)盡量保持與數(shù)據(jù)庫的連接, 減少連接數(shù)據(jù)庫的次數(shù).PowerBuilder 提供里兩個(gè)函數(shù)來建立數(shù)據(jù)窗口與事務(wù)對象的連接:        SetTrans()     

17、;   SetTransObject()在程序中應(yīng)當(dāng)盡量使用 SETTRANSOBJECT(), 因?yàn)镾ETTRANS() 函數(shù)在每次調(diào)用 RETRIEVE(), Update() 等函數(shù)之后, 都要執(zhí)行數(shù)據(jù)庫的連接和斷開操作.2. 下拉數(shù)據(jù)窗口與表的連接    對于數(shù)據(jù)庫服務(wù)器來說, 表的連接操作是一項(xiàng)非常大的開銷, 而 POWERBUILDER 提供的下拉數(shù)據(jù)窗口在某些情況下可以代替表的連接操作.例如,

18、 為了在數(shù)據(jù)窗口上顯示用戶的電話號碼和姓名:如果用表的連接的方法, 數(shù)據(jù)窗口對應(yīng)的 SQL 語句應(yīng)是這樣的:        Select "DA_DH"."DHHM",                "DA_HTH"."DWM"&

19、#160;       FROM "DA_HTH",        "DA_DH"        Where ("DA_HTH"."DHHM"="DA_DH"."DHHM")同樣的程序可用下拉數(shù)據(jù)窗口來完成, 這里不再具

20、體介紹.但是, 應(yīng)當(dāng)注意, 以上兩種方法究竟哪一種數(shù)據(jù)更快, 與表的結(jié)構(gòu), 表的數(shù)量, 連接的方法等均有關(guān)系, 應(yīng)當(dāng)具體分析.3. 共享數(shù)據(jù)在一個(gè)應(yīng)用程序中, 某些數(shù)據(jù)需要頻繁的使用, 如果在每次使用時(shí)都從數(shù)據(jù)庫中進(jìn)行檢索, 則需占用大量的服務(wù)器資源和網(wǎng)絡(luò)資源. 為了減少開銷, 可以在客戶端對這些數(shù)據(jù)只進(jìn)行一次檢索, 然后允許其它任務(wù)共享這些數(shù)據(jù).例如, 如果有兩個(gè)數(shù)據(jù)窗口, 都需要從第三方表中檢索出用戶的電話號碼, 且此列用下拉數(shù)據(jù)窗

21、口給出. 如果每次都對電話號碼進(jìn)行檢索, 則性能較低. 因此, 可以單獨(dú)建立一個(gè)關(guān)于電話號碼的數(shù)據(jù)窗口. 在每次打開窗口時(shí), 首先將電話號碼檢索到此數(shù)據(jù)窗口中, 然后另外兩個(gè)數(shù)據(jù)窗口中關(guān)于電話號碼的下拉數(shù)據(jù)窗口可以共享此數(shù)據(jù)窗口中的數(shù)據(jù).在窗口的 OPEN 事件中編寫如下程序:        dw_1.settransobject(sqlca)       

22、 dw_2.settransobject(sqlca)        dw_3.settransobject(sqlca)        / 檢索 dw_1        dw_1.retrieve()        / 使 DW

23、_2 的下拉數(shù)據(jù)窗口共享 DW_1        datawindowchild child1        dw_2.getchild('dhhm',child1)        child1.settransobject(sqlca)      &#

24、160; dw_1.sharedata(child1)        / 使 DW_3 的下拉數(shù)據(jù)窗口共享 DW_1        datawindowchild child2        dw_3.getchild('dhhm',child2)   

25、     child2.settransobject(sqlca)        dw_1.sharedata(child2)使用這種方法, 避免了各個(gè)數(shù)據(jù)窗口間物理的拷貝數(shù)據(jù), 因此減少了空間上的開銷,提高了應(yīng)用程序的綜合性能.4. 數(shù)據(jù)窗口間數(shù)據(jù)的拷貝如果需要在數(shù)據(jù)窗口間共享數(shù)據(jù), 應(yīng)當(dāng)盡量使用 SHAREDATA() 函數(shù), 但是,SHAREDATA() 函數(shù)并不是物理地在數(shù)據(jù)窗口

26、間拷貝數(shù)據(jù), 如果在顯示數(shù)據(jù)的同時(shí), 還要對數(shù)據(jù)進(jìn)行操作, 則需要進(jìn)行數(shù)據(jù)的拷貝.例如, 要求將 DW_1 中選定的行拷貝到 DW_2 中:    在窗口的 OPEN 事件中編程:        dw_1.settransobject(sqlca)        dw_2.settransobjec

27、t(sqlca)        dw_1.retrieve()    在數(shù)據(jù)窗口 DW_1 的 ROWFOCUSCHANGED 事件中編寫下列程序:        long lr        lr = dw_1.selectrow(0,false)

28、        lr = dw_1.getrow()        lr = dw_1.selectrow(lr,true)要完成從 DW_1 到 DW_2 的拷貝工作, 有兩種方法:第一種:在按鈕 "拷貝" 的 CLICKED 事件中編程long lrlr =

29、0;dw_1.getselectedrow(0)dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)執(zhí)行程序, 利用 POWERBUILDER PROFILER 得出所需時(shí)間為 1.7034(百分之一秒)第二種:在按鈕 "拷貝" 的 CLICKED 事件中編程dw_2.object.data = da_1.object.data.selected執(zhí)行程序, 利用 POWERBUILDER PRO

30、FILER 得出所需時(shí)間為 0.8062(百分之一秒)5. 數(shù)據(jù)窗口屬性的訪問和修改A. 數(shù)據(jù)窗口屬性的訪問    在程序中訪問數(shù)據(jù)窗口的屬性有下列幾種方法:    A1. 采用點(diǎn)表達(dá)式訪問    A2. 應(yīng)用多個(gè)獨(dú)立的 DESCRIBE() 函數(shù)訪問    A3. 只使用一個(gè) DESCRIBE() 函數(shù), 采用復(fù)合參

31、數(shù)訪問多個(gè)屬性上面三中方法, 通常第一種方法最慢, 第三種方法最快.例如:    在窗口的 OPEN 事件中    DW_1.SETTRANSOBJECT(SQLCA)    DW_1.RETRIEVE()第一種方法:在檢索按鈕的 CLICKED 事件中編程.    string dx, dy, dh, dw  

32、60; dx = dw_1.object.da_dh.x    dy = dw_1.object.da_dh.y    dx = dw_1.object.da_dh.height    dy = dw_1.object.da_dh.width    st_1.text =dx+","+dy+","+

33、dh+","+dw第二種方法:    string dx, dy, dh, dw    dx=dw_1.describe("da_dh.x")    dx=dw_1.describe("da_dh.y")    dx=dw_1.describe("da_dh.height")   

34、0;dx=dw_1.describe("da_dh.width")    st_1.text =dx+","+dy+","+dh+","+dw第三種方法:    string dx, dy, dh, dw    st_1.text=dw_1.describe("da_dh.x" +&  &#

35、160;                         "da_dh.y" +&                   &

36、#160;        "da_dh.height" +&                            "da_dh.width")實(shí)驗(yàn)證明, 第三種方法的速度

37、是最快的. 但是程序的可讀性最差.B. 數(shù)據(jù)窗口屬性的修改在程序中修改數(shù)據(jù)窗口的屬性有下列幾種方法:    A1. 采用點(diǎn)表達(dá)式修改    A2. 應(yīng)用多個(gè)獨(dú)立的 MODIFY() 函數(shù)訪問    A3. 只使用一個(gè) MODIFY() 函數(shù), 采用復(fù)合參數(shù)訪問多個(gè)屬性上面三中方法, 通常第一種方法最慢, 第三種方法最快.例如:  

38、0; 在窗口的 OPEN 事件中    DW_1.SETTRANSOBJECT(SQLCA)    DW_1.RETRIEVE()第一種方法:在檢索按鈕的 CLICKED 事件中編程.    DW_1.SETREDRAW(FALSE)    dw_1.object.da_dh.x = 18    dw_1.object.da_d

39、h.y = 16    dw_1.object.da_dh.height = 100    dw_1.object.da_dh.width = 200    DW_1.setredraw(true)    st_1.text =dx+","+dy+","+dh+","+dw第二種方法:  

40、  DW_1.SETREDRAW(FALSE)    dw_1.modify("da_dh.x = 18")    dw_1.modify("da_dh.y = 16")    dw_1.modify("da_dh.height = 100")    dw_1.modify("da_dh.

41、width = 200")    dw_1.setredraw(true)第三種方法:    dw_1.modify("da_dh.x=18" +&                "da_dh.y=16" +&   

42、0;            "da_dh.height=100" +&                "da_dh.width=200")實(shí)驗(yàn)證明, 第三種方法的速度是最快的. 但是程序的可讀性最差.注意, 在方法一和方法二中,&#

43、160;都使用的 setredraw() 函數(shù)以減少屏幕的重繪, 否則, 執(zhí)行速度將嚴(yán)重下降.6. 數(shù)據(jù)窗口中數(shù)據(jù)的訪問在程序中, 經(jīng)常會需要動態(tài)的修改數(shù)據(jù)窗口中的數(shù)據(jù). 對此, PB提供了多種方法, 各種方法在性能上會有一些差異.A. 數(shù)據(jù)窗口中數(shù)據(jù)的訪問    目的: 將數(shù)據(jù)窗口中的電話號碼存放在一個(gè)數(shù)組中.    請比較下面兩中方法.    方法一: 

44、   string da_dh    long ll,i    ll = dw_1.rowcount()    for i = ll to 1 stet -1    da_dhi = dw_1.getitemstring(i,"dhhm") 

45、0;  next    方法二:    string da_dh    da_dh = dw_1.object.dhhm.current測試發(fā)現(xiàn), 第二種方法比第一種方法快將近一倍. 數(shù)據(jù)量越大這種差異越明顯.B. 數(shù)據(jù)窗口中數(shù)據(jù)的修改    目的: 修改數(shù)據(jù)窗口中的電話號碼列的值.    請比較下面兩中方法

46、.    方法一:    dw_1.setitem(i,"dhhm",l_name)    方法二:    dw_1.i = l_name測試發(fā)現(xiàn), 第二種方法比第一種方法快將近一倍. 數(shù)據(jù)量越大這種差異越明顯.7. 數(shù)據(jù)窗口事件對性能的影響對于數(shù)據(jù)窗口控制中經(jīng)常發(fā)生的事件, 應(yīng)當(dāng)盡量減少其中的程序代碼.特別是如下事件:    A. itemchanged    b. editchanged    c. itemfo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論