[SAP ABAP開發技術總結]ABAP調優——代碼優化

 

11.2.     程序

1.   READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH讀取標準內表使用二分查找算法

2.   循環(LOOP AT ...WHERE..)或查詢READ TABLE ...)某內表時,若是未使用索引(排序表、哈希表)或二分查找,則在查詢組合字段建立第二索引查詢時經過USE KEYWITH [TABLE] KEY選項使用第二索引,這樣在查詢時會自動進行二分查找或哈希找查數據庫

在沒有用二分查找的狀況下,可在查詢組合字段上建立第二索引(哈希或排序索引),則在讀取或循環內表時會自動使用二分查找或哈希查找算法編程

3.   查找時,優先考慮使用哈希表進行查找,再考慮使用排序表進行二分查找由於哈希查找的時間複雜度爲(O (1)),不會因數據的增長而受到影響;而二分查找雖然比順序搜索快不少,但隨着數據的增長會慢下來,其時間複雜度爲(O (log2n));標準內表的時間複雜度爲O(n)。注:若是隻使用到部分關鍵字爲搜索條件,哈希表則會全表掃描,此時應該使用二分找查性能

4.   FOR ALL ENTRIES:須要判斷內表是否爲空,不然會查詢出全部數據優化

5.   LOOP AT itab... ASSIGNING ...READTABLE ...ASSIGNING ... 在循環或讀取內表時,使用字段符號來替換表工做區,將數據分配給字段符號Field Symbols減小數據來回傳遞spa

6.   儘可能避免嵌套循環,如必須時,將循環次數少的放在外層,次數多的放在內層,這樣能夠減小在不一樣循環層之間的頻繁地切換及內部循環次數orm

7.   條件語句中多使用短路與或,「與」鏈接時將爲假的機率大的條件放在前面,「或」鏈接時將爲真的機率大的條件放在前面htm

8.   少使用遞歸算法,遞歸時會增長調用棧層次,下降了性能,可以使用隊列或棧來避免遞歸排序

9.   儘可能不要使用通用類型(如FIELD-SYMBOLS、及形式參數),使用具體限定類型;比較時儘可能使用同一數據類型:IF c = c.IF i = c.快,緣由是未發生類型轉換遞歸

10.不要使用混合類型進行計算與比較,除非有必須

11.儘可能使用靜態語句,少用動態編程,動態編輯雖然靈活,但性能有所降低

12.在對字符進行操做進,儘可能使用String代替C固定長度類型,如:concatenate[kənˈkatɪneɪt]語句對固定長度的C鏈接時,會去掃描那些非空字符出來再進行鏈接,速度沒有String

13.READ/MODIFY TABLE時使用TRANSPORTING只讀取或修改必要的字段 [trænsˈpɔ:t]

14.儘可能避免使用MOVE-CORRESPONDINGSELECT...INTO CORRESPONDING FIELDS OF [TABLE](SELECT時,查詢幾個字段就定義具備這幾個字段的內表,而不是直接使用基於數據庫表類型建立的內表,不然若是直接使用 INTO TABLE語法檢查時會警告,但結果是沒有問題的)CORRESPONDING語句在系統內部存在隱式操做: 逐個字段的檢查元素名稱匹配; 檢查元素類型匹配;元素類型轉換[ˌkɔrisˈpɔndiŋ] 

15.最好不要向排序內表中插入INSERT ... INTO TABLE ...數據,由於在插入時會進行排序,速度會隨着數據量的增長而慢下來,因此最好只向標準內表或哈希表中插入數據

16.將某個內表中的所有記錄或部分記錄追加到另外一內表時,使用INSERT/APPEND LINES OF … 代替循環逐條追加;若是是全新賦值,直接對內表使用「=」進行賦值操做便可

17.調用類方法要快於Function

Calling Methods of global Classes    call method CL_PERFORMANCE_TEST=>M1.

Calling Function Modules         call function 'FUNCTION1'.

18.經過運行事務代碼SLIN(或者直接經過SE38的菜單),進行代碼靜態檢查,根據SAP提供的反饋信息,優化代碼

19.      經過老式方式定義內表時,使用OCCURS 0 而非OCCURS n [əˈkə:s]  重現

l  OCCURS n 表明初始化內表的空間大小爲n(空間固定),當內表存儲記錄條數超出n時,系統將依靠頁面文件存放超出部分的數據 當系統內存資源十分緊缺的時候, 咱們可使用OCCURS n的初始化方法, 可是這樣的效率稍微慢

l  OCCURS 0 表明初始化內表的空間大小爲無限,當內表存儲記錄條數不斷增長時, 內表所使用的內存空間不斷擴大, 直到系統沒法分配爲止。 使用內存比使用頁面交換更快一些 可是要考慮系統的資源狀態

20.使用完成後及時清空釋放內表所佔用的空間:FREE <itab>.

21.使用CASE…WHEN語句代替 IF…ELSEIF…;使用WHILE…ENDWHILE 代替 DO…ENDDO

22.LOOP循環內表時加上Where條件減小CPU負荷,而不是在循環裏經過IF語句來過濾數據

相關文章
相關標籤/搜索