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

下載本文檔

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

文檔簡(jiǎn)介

優(yōu)化你的PB程序(深圳:獨(dú)孤求敗2003-05-27)一、處理SQL語(yǔ)句1、 緩沖SQL語(yǔ)句在應(yīng)用程序中,有時(shí)需要反復(fù)調(diào)用同一組SQL語(yǔ)句,在這種情況下,可以通過(guò)在應(yīng)用中為這些SQL建立緩沖區(qū)來(lái)提高執(zhí)行性能。在缺省情況下,SQL語(yǔ)句的緩沖區(qū)是關(guān)閉的,你可以通過(guò)如下語(yǔ)句打開(kāi)它:SQLCACHE=nn表示裝入緩沖區(qū)的SQL語(yǔ)句數(shù)量(缺省為0)。例如:dw_1.SetTransObject(sqlca)SQLCA.dbParm="SQLCache=0"dw_1.retrieve()如果將上例的"SQLCache=0"改為"SQLCache=25”,此句的執(zhí)行效率將提高五分之一左右。但應(yīng)注意緩沖區(qū)的大小,否則也將影響程序執(zhí)行的性能。注:此方法對(duì)用ODBC和ORACLE連接的數(shù)據(jù)庫(kù)非常有效。2、 捆綁變量請(qǐng)看下例:SQLCA.DBPARM="DISABLEBIND=1"INSERTINTODA_DHvalueS("1”,"河南0")INSERTINTODA_DHvalueS("2”,"河南1")INSERTINTODA_DHvalueS("3”,"河南2")INSERTINTODA_DHvalueS("4”,"河南3")INSERTINTODA_DHvalueS("5”,"河南4")INSERTINTODA_DHvalueS("6”,"河南5")這里未使用捆綁變量,在插入是PB將重新處理每個(gè)帶有 新值的SQL語(yǔ)句。如果將上例改為:SQLCA.DBPARM="DISABLEBIND=0"INSERTINTODA_DHINSERTINTODA_DHINSERTINTODA_DHINSERTINTODA_DHINSERTINTODA_DHINSERTINTODA_DHINSERTINTODA_DHINSERTINTODA_DHvalueS("1”,”河南0”)valueS("2”,”河南1")valueS("3”,”河南2")valueS("4”,”河南3")valueS("5”,”河南4")valueS("6”,”河南5")則系統(tǒng)將把INSERT語(yǔ)句按如下格式進(jìn)行處理:INSERTINTODA_DHvalueS(?,?)其中”?"稱為占位符。系統(tǒng)性能將有所增強(qiáng)。3、用數(shù)據(jù)窗口代替SQL語(yǔ)句通常,為了獲得某些數(shù)據(jù),采用數(shù)據(jù)窗口和SQL語(yǔ)句都是可行的,但是PB對(duì)數(shù)據(jù)窗口和SQL語(yǔ)句采用不同的處理機(jī)制,因此,具有不同的效率。例:為里檢索電話檔案中的用戶名,可以利用SQL語(yǔ)句,將所有的數(shù)據(jù)檢索到一個(gè)多行編輯中,也可以檢索到一個(gè)數(shù)據(jù)窗口中。如果使用第一種方法:首先定義一個(gè)游標(biāo):DECLARECURCURSORFORSELECT"DA_DH”."HM”FROM"DA_DH”;然后可以:STRINGstxt[],stintliopencurdoli=li+1fetchcurinto:stxt[li];st=st+stxt[li]+"~r~n"loopwhilestxt[li]<>"”closecur;mle_1.txt=st也可以使用第二種方法:dw_1.settransobject(sqlca)dw_1.retrieve()利用POWERBUILDERPROFILER工具進(jìn)行檢查,對(duì)比兩種方法所需時(shí)間如下方法 所需時(shí)間(百分之一秒)SQL語(yǔ)句 100.9857數(shù)據(jù)窗口 49.0133由于數(shù)據(jù)窗口或DATASTORE使用了標(biāo)準(zhǔn)的內(nèi)嵌的代碼,而不是有開(kāi)發(fā)人員進(jìn)行全部編碼,同時(shí)編譯執(zhí)行的速度比解釋執(zhí)行的速度快的多,因此在開(kāi)發(fā)過(guò)程中應(yīng)盡量使用數(shù)據(jù)窗口和DATASTORE.. 即使是必須用SQL語(yǔ)句的時(shí)候,也應(yīng)該盡量將它們定義為存儲(chǔ)過(guò)程(特別是在多用戶的環(huán)境中),以提高應(yīng)用程序的性能.二、數(shù)據(jù)窗口的編程和執(zhí)行數(shù)據(jù)窗口是PB最值得被稱道的,其具有如下特點(diǎn):1、 多種顯示方式.2、 多種編輯方式.3、 使用方法簡(jiǎn)單.4、 具有多種報(bào)表形式.5、 可實(shí)現(xiàn)屏幕滾動(dòng).6、 可實(shí)現(xiàn)數(shù)據(jù)的有效性校驗(yàn).7、 執(zhí)行性能顯著提高.8、 編程工作變少.9、 可以在數(shù)據(jù)窗口內(nèi)部實(shí)現(xiàn)數(shù)據(jù)哭的更新.下面,我將介紹一些用于提高數(shù)據(jù)窗口性能的技術(shù).1、 減少連接數(shù)據(jù)庫(kù)的次數(shù)連庫(kù)操作是非常影響執(zhí)行速度的操作.因此在程序中,一旦與數(shù)據(jù)庫(kù)連接后就應(yīng)當(dāng)盡量保持與數(shù)據(jù)庫(kù)的連接,減少連接數(shù)據(jù)庫(kù)的次數(shù).PowerBuilder提供里兩個(gè)函數(shù)來(lái)建立數(shù)據(jù)窗口與事務(wù)對(duì)象的連接:SetTrans()SetTransObject()在程序中應(yīng)當(dāng)盡量使用SETTRANSOBJECT(),因?yàn)镾ETTRANS()函數(shù)在每次調(diào)用RETRIEVE(),UPDATE()等函數(shù)之后,都要執(zhí)行數(shù)據(jù)庫(kù)的連接和斷開(kāi)操作.2、 下拉數(shù)據(jù)窗口與表的連接對(duì)于數(shù)據(jù)庫(kù)服務(wù)器來(lái)說(shuō),表的連接操作是一項(xiàng)非常大的開(kāi)銷(xiāo),而POWERBUILDER提供的下拉數(shù)據(jù)窗口在某些情況下可以代替表的連接操作.例如,為了在數(shù)據(jù)窗口上顯示用戶的電話號(hào)碼和姓名:如果用表的連接的方法,數(shù)據(jù)窗口對(duì)應(yīng)的SQL語(yǔ)句應(yīng)是這樣的:SELECT"DA_DH”."DHHM”,"DA_HTH”."DWM”FROM"DA_HTH”,"DA_DH”WHERE("DA_HTH”."DHHM"="DA_DH”."DHHM")同樣的程序可用下拉數(shù)據(jù)窗口來(lái)完成,這里不再具體介紹.但是,應(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ù)庫(kù)中進(jìn)行檢索,則需占用大量的服務(wù)器資源和網(wǎng)絡(luò)資源.為了減少開(kāi)銷(xiāo),可以在客戶端對(duì)這些數(shù)據(jù)只進(jìn)行一次檢索,然后允許其它任務(wù)共享這些數(shù)據(jù).例如,如果有兩個(gè)數(shù)據(jù)窗口,都需要從第三方表中檢索出用戶的電話號(hào)碼,且此列用下拉數(shù)據(jù)窗口給出.如果每次都對(duì)電話號(hào)碼進(jìn)行檢索,則性能較低.因此,可以單獨(dú)建立一個(gè)關(guān)于電話號(hào)碼的數(shù)據(jù)窗口.在每次打開(kāi)窗口時(shí),首先將電話號(hào)碼檢索到此數(shù)據(jù)窗口中,然后另外兩個(gè)數(shù)據(jù)窗口中關(guān)于電話號(hào)碼的下拉數(shù)據(jù)窗口可以共享此數(shù)據(jù)窗口中的數(shù)據(jù).在窗口的OPEN事件中編寫(xiě)如下程序:dw_1.settransobject(sqlca)dw_2.settransobject(sqlca)dw_3.settransobject(sqlca)//檢索dw_1dw_1.retrieve()//使DW_2的下拉數(shù)據(jù)窗口共享DW_1datawindowchildchild1dw_2.getchild('dhhm',child1)child1.settransobject(sqlca)dw_1.sharedata(child1)//使DW_2的下拉數(shù)據(jù)窗口共享DW_1datawindowchildchild2dw_3.getchild('dhhm',child2)child2.settransobject(sqlca)dw_1.sharedata(child1)使用這種方法,避免了各個(gè)數(shù)據(jù)窗口間物理的拷貝數(shù)據(jù),因此減少了空間上的開(kāi)銷(xiāo),提高了應(yīng)用程序的綜合性能.4、數(shù)據(jù)窗口間數(shù)據(jù)的拷貝如果需要在數(shù)據(jù)窗口間共享數(shù)據(jù),應(yīng)當(dāng)盡量使用SHAREDATA()函數(shù),但是,SHAREDATA()函數(shù)并不是物理地在數(shù)據(jù)窗口間拷貝數(shù)據(jù),如工在顯示數(shù)據(jù)的同時(shí),還要對(duì)數(shù)據(jù)進(jìn)行操作,則需要進(jìn)行數(shù)據(jù)的拷貝.例如,要求將DW_1中選定的行拷貝到DW_2中:在窗口的OPEN事件中編程:dw_1.settransobject(sqlca)dw_2.settransobject(sqlca)dw_1.retrieve()在數(shù)據(jù)窗口DW_1的ROWFOCUSCHANGED事件中編寫(xiě)下列程序:longlrlr=dw_1.selectrow(0,false)lr=dw_1.getrow()lr=dw_1.selectrow(lr,true)要完成從DW_1到DW_2的拷貝工作,有兩種方法:第一種:在按鈕"拷貝”的CLICKED事件中編程longlrlr=dw_1.getselectedrow(0)dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)執(zhí)行程序,利用POWERBUILDERPROFILER得出所需時(shí)間為1.7034(百分之一秒)第二種:在按鈕"拷貝”的CLICKED事件中編程dw_2.object.data=da_1.object.data.selected執(zhí)行程序,利用POWERBUILDERPROFILER得出所需時(shí)間為0.8062(百分之一秒)5、數(shù)據(jù)窗口屬性的訪問(wèn)和修改A、數(shù)據(jù)窗口屬性的訪問(wèn)在程序中訪問(wèn)數(shù)據(jù)窗口的屬性有下列幾種方法:A1、采用點(diǎn)表達(dá)式訪問(wèn)A2、應(yīng)用多個(gè)獨(dú)立的DESCRIBE()函數(shù)訪問(wèn)A3、只使用一個(gè)DESCRIBE()函數(shù),采用復(fù)合參數(shù)訪問(wèn)多個(gè)屬性上面三中方法,通常第一種方法最慢,第三種方法最快.例如:在窗口的OPEN事件中DW_1.SETTRANSOBJECT(SQLCA)DW_1.RETRIEVE()第一種方法:在檢索按鈕的CLICKED事件中編程.stringdx,dy,dh,dwdx=dw_1.object.da_dh.xdy=dw_1.object.da_dh.ydx=dw_1.object.da_dh.heightdy=dw_1.object.da_dh.widthst_1.text=dx+",''+dy+'',"+dh+'',''+dw第二種方法:stringdx,dy,dh,dwdx=dw_1.describe("da_dh.x")dx=dw_1.describe("da_dh.y")dx=dw_1.describe("da_dh.height")dx=dw_1.describe("da_dh.width")st_1.text=dx+",''+dy+'',"+dh+'',''+dw第三種方法:stringdx,dy,dh,dwst_1.text=dw_1.describe("da_dh.x"+"a_dh.y"+"da_dh.height"+"da_dh.width")實(shí)驗(yàn)證明,第三種方法的速度是最快的.但是程序的可讀性最差.B.數(shù)據(jù)窗口屬性的修改在程序中修改數(shù)據(jù)窗口的屬性有下列幾種方法:A1.采用點(diǎn)表達(dá)式修改A2.應(yīng)用多個(gè)獨(dú)立的MODIFY()函數(shù)訪問(wèn)A3.只使用一個(gè)MODIFY()函數(shù),采用復(fù)合參數(shù)訪問(wèn)多個(gè)屬性上面三中方法,通常第一種方法最慢,第三種方法最快.例如:在窗口的OPEN事件中DW_1.SETTRANSOBJECT(SQLCA)DW_1.RETRIEVE()第一種方法:在檢索按鈕的CLICKED事件中編程.DW_1.SETREDRAW(FALSE)dw_1.object.da_dh.x=18dw_1.object.da_dh.y=16dw_1.object.da_dh.height=100dw_1.object.da_dh.width=200DW_1.setredraw(true)st_1.text=dx+",''+dy+'',"+dh+'',''+dw第二種方法: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.width=200")dw_1.setredraw(true)第三種方法:dw_1.modify("da_dh.x=18"+"da_dh.y=16"+"da_dh.height=100"+"da_dh.width=200")實(shí)驗(yàn)證明,第三種方法的速度是最快的.但是程序的可讀性最差.注意,在方法一和方法二中,都使用的setredraw()函數(shù)以減少屏幕的重繪,否則,執(zhí)行速度將嚴(yán)重下降.6、數(shù)據(jù)窗口中數(shù)據(jù)的訪問(wèn)在程序中,經(jīng)常會(huì)需要?jiǎng)討B(tài)的修改數(shù)據(jù)窗口中的數(shù)據(jù).對(duì)此,PB提供了多種方法,各種方法在性能上會(huì)有一些差異.A、 數(shù)據(jù)窗口中數(shù)據(jù)的訪問(wèn)目的:將數(shù)據(jù)窗口中的電話號(hào)碼存放在一個(gè)數(shù)組中.請(qǐng)比較下面兩中方法.方法一:stringda_dh[]longll,ill=dw_1.rowcount()fori=llto1stet-1da_dh[i]=dw_1.getitemstring(i,"dhhm")next方法二:stringda_dh[]da_dh[]=dw_1.object.dhhm.current測(cè)試發(fā)現(xiàn),第二種方法比第一種方法快將近一倍.數(shù)據(jù)量越大這種差異越明顯.B、 數(shù)據(jù)窗口中數(shù)據(jù)的修改目的:修改數(shù)據(jù)窗口中的電話號(hào)碼列的值.請(qǐng)比較下面兩中方法.方法一:dw_1.setitem(i,"dhhm”,l_name)方法二:dw_1.[i]=l_name測(cè)試發(fā)現(xiàn),第二種方法比第一種方法快將近一倍.數(shù)據(jù)量越大這種差異越明顯.7、數(shù)據(jù)窗口事件對(duì)性能的影響對(duì)于數(shù)據(jù)窗口控制中經(jīng)常發(fā)生的事件,應(yīng)當(dāng)盡量減少其中的程序代碼.特別是如下事件:a、 itemchangedb、 editchangedc、 itemfocuschangedd、 pbm_dwnkeye、 rowfocuschangedf、 retrieverow在這些事件中的任何處理程序,都會(huì)降低應(yīng)用程序的處理速度.所以應(yīng)當(dāng)盡量減少這些事件中的處理程序,必要時(shí),可以考慮只將重要的代碼放在這些事件中,而將剩余的代碼放在一個(gè)傳遞的事件中.例如,如果需要用到數(shù)據(jù)窗口的ROWFOCUSCHANGED事件,可以為數(shù)據(jù)窗口定義一用戶事件”UE_RE”, 而在數(shù)據(jù)窗口的

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論