現象、問題描述
在「綜合管理應用平台」客戶端的立即批處理面板,匯入
10m大小的命令指令碼檔案(假設該指令碼檔案的所有命令均為「
qry gol:;
」),如果使用者需要把命令檔案中的所有「
gol」替換成「
log」
,大約需要耗費幾個小時的時間,嚴重影響立即批處理面板查詢替換的使用效果。
關鍵過程、根本原因分析
在立即批處理面板中查詢替換過程實現如下:
1、查詢滿足匹配的字串。得到匹配字串的起始和終止位置。 2
、在事件派發執行緒中更新
jtextarea
中匹配的字串。重新整理客戶端介面。 3
、迴圈第一步,直到完成為止。
效率的瓶頸是一次查詢替換,一次更新客戶端介面。
10m的批處理指令碼檔案大約能容納
100萬行「
qry log:;
」命令,即需要完成
100萬次查詢替換和更新介面操作,直接的表現是客戶端替換的速度非常慢。
結論、解決方案及效果
基於以上效能瓶頸分析,有如下方案可以採納: 1
、用乙個字元陣列儲存從
jtextarea
中取出的字串。在實現的過程中再用另外的乙個字元陣列儲存替換的結果。完成替換操作後一次更新客戶端介面。 2
、用乙個字元陣列儲存從
jtextarea
中取出的字串。同時在該字元陣列中進行替換。完成替換操作後一次更新客戶端介面。 3
、一次從
jtextarea
中取出一部分字串(一次
32k)
。完成替換後更新介面。再取出一部分字串進行更新。直到替換完成為止。
方案分析:
第乙個方案:在立即批處理面板中匯入
10m的命令指令碼檔案,客戶端已經占用
120m
左右的記憶體。客戶端最大的堆記憶體設定為
256m
。在實現的過程中採用兩個陣列來儲存命令指令碼。由於兩個陣列均儲存
10m大小的字串,如果客戶端正在執行某個費記憶體的操作,在查詢替換的過程中必定會發生記憶體溢位
(outofmemoryerror)
的錯誤。為了規避方案一的錯誤,採用方案二。但是在方案二中替換的過程只採用乙個陣列,必定會導致陣列長度頻繁波動,多次出現申請新陣列的動作,效率也是較慢。綜合第
一、第二種方案,第三種方案採用從
jtextarea
中部分取出字串(在實現的過程中驗證一次取
32k較適合),即採用多次申請小塊的記憶體替代一次申請大塊的記憶體,雖然會產生較多的臨時變數,但這些臨時變數能被
jvm及時**,避免發生記憶體溢位錯誤。替換的過程也是採用同方案一一樣,用兩個字元陣列,乙個儲存源字串,乙個儲存替換結果。完成一次替換,更新一次介面。從實現的結果看,收效甚好。
第三種方案效能分析:
10m的命令指令碼檔案(若命令指令碼中均為「
qry gol:;
」)大約有
100萬行。按原先的演算法把「
gol」全部替換成「
log」需要
100萬次介面更新;若採用第三種方案一次取出
32k進行更新,需要
320次介面更新。前者更新介面的次數是後者的
3125
倍。即後者介面更新的效率較前者大約提公升
3000
倍。從實現完成的效果看,完成一次
10m批處理指令碼的替換過程大約
2分鐘左右。
經驗總結、預防措施和規範建議
在進行需要耗費大記憶體操作的過程中,在不影響程式執行效率的前提下可以轉化成只需要小記憶體的部分執行操作。部分執行全部完成等價於整個大操作完成。即在申請小記憶體的環境下完成需要耗費大記憶體的操作。化整為零,各個擊破。
在VBA中進行除錯
只要從您的專案中觸發 vba就會執行。從簡單的開啟表單到單擊命令按鈕,各種各樣的物件事件都可能引起這種情況。當某些事情無法按預期工作時,您如何才能準確確定出什麼問題以及在 好吧,這就是本文可以為您提供的幫助。對於每個office應用程式,當然包括access,都有乙個整合的偵錯程式。要開啟偵錯程式視...
在Release版本中進行除錯
在release版本中進行除錯 許多開發人員在利用visual c 6.0開發程式時,經常會遇到程式在debug版本中能夠正常執行,但是在release版本中就會出現問題的情況。為了在release版本中發現和解決問題,需要在release版本中除錯程式,可是release版本卻不支援除錯,這該怎麼...
在ogre中進行精細射線檢測
ogre有乙個rayscenequery的類,在預設場景管理器下,這個類返回一組rayscenequeryresultentry,他們都是通過包圍盒進行的檢測,由於包圍盒過於簡陋,我們可以再進行更精細的基於面的射線碰撞檢測。主要注意的就是mesh的構造方式,是否用了index,index是16位還是...