早上老白突然问个无聊的问题:将一个数取反,怎么写速度最快?
进而引发了一群人的探讨:
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
REPORT z_barry_test NO STANDARD PAGE HEADING. DATA: t1 TYPE i, t2 TYPE i, pp TYPE p . pp = '123456.78'. GET RUN TIME FIELD t1. DO 1000000 TIMES. pp = - pp . ENDDO. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE : / ' - :' ,t1. GET RUN TIME FIELD t1. DO 1000000 TIMES. pp = 0 - pp . ENDDO. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE : / '0 - :' ,t1. GET RUN TIME FIELD t1. DO 1000000 TIMES. pp = pp * -1 . ENDDO. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE : / '* -1 :' , t1. |
下面代码是测试内表取值速度的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
REPORT z_barry_test NO STANDARD PAGE HEADING. DATA: BEGIN OF itab OCCURS 0 , ebeln LIKE ekko-ebeln, ebelp LIKE ekpo-ebelp, matnr LIKE ekpo-matnr, END OF itab. DATA: BEGIN OF item OCCURS 0 , ebelp LIKE ekpo-ebelp, matnr LIKE ekpo-matnr, END OF item. DATA: BEGIN OF header OCCURS 0 , ebeln LIKE ekko-ebeln, items LIKE item[], END OF header. DATA: hs_header LIKE HASHED TABLE OF header WITH UNIQUE KEY ebeln WITH HEADER LINE. DATA: BEGIN OF it_out OCCURS 0 , ebeln LIKE ekko-ebeln, lines(100), END OF it_out. DATA: itab2 LIKE itab[] WITH HEADER LINE. DATA: t1 TYPE i, t2 TYPE i. START-OF-SELECTION. SELECT ekko~ebeln ekpo~ebelp ekpo~matnr INTO TABLE itab FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln UP TO 30000 ROWS. GET RUN TIME FIELD t1. itab2[] = itab[]. SORT itab2 BY ebeln. DELETE ADJACENT DUPLICATES FROM itab2 COMPARING ebeln. LOOP AT itab2. CLEAR it_out. LOOP AT itab WHERE ebeln = itab2-ebeln. CONCATENATE it_out-lines ',' itab-ebelp INTO it_out-lines. ENDLOOP. it_out-ebeln = itab2-ebeln. APPEND it_out. ENDLOOP. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE t1. ****优化算法 DATA: tabix LIKE sy-tabix. CLEAR it_out[]. SORT itab BY ebeln ebelp. itab2[] = itab[]. DELETE ADJACENT DUPLICATES FROM itab2 COMPARING ebeln. GET RUN TIME FIELD t1. LOOP AT itab2. CLEAR it_out. READ TABLE itab WITH KEY ebeln = itab2-ebeln BINARY SEARCH. IF sy-subrc = 0. tabix = sy-tabix. LOOP AT itab FROM tabix WHERE ebeln = itab2-ebeln. CONCATENATE it_out-lines ',' itab-ebelp INTO it_out-lines. ENDLOOP. ENDIF. it_out-ebeln = itab2-ebeln. APPEND it_out. ENDLOOP. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1. ****继续优化算法 CLEAR it_out[]. SORT itab BY ebeln ebelp. itab2[] = itab[]. DELETE ADJACENT DUPLICATES FROM itab2 COMPARING ebeln. GET RUN TIME FIELD t1. LOOP AT itab2. CLEAR it_out. READ TABLE itab WITH KEY ebeln = itab2-ebeln BINARY SEARCH. IF sy-subrc = 0. tabix = sy-tabix. LOOP AT itab FROM tabix. IF itab-ebeln <> itab2-ebeln. EXIT. ENDIF. CONCATENATE it_out-lines ',' itab-ebelp INTO it_out-lines. ENDLOOP. ENDIF. it_out-ebeln = itab2-ebeln. APPEND it_out. ENDLOOP. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1. ****深层哈希表, CLEAR it_out[]. GET RUN TIME FIELD t1. LOOP AT itab. CLEAR hs_header. READ TABLE hs_header WITH TABLE KEY ebeln = itab-ebeln. IF sy-subrc = 0. MOVE-CORRESPONDING itab TO item. APPEND item TO hs_header-items. MODIFY TABLE hs_header. ELSE. MOVE-CORRESPONDING itab TO hs_header. MOVE-CORRESPONDING itab TO item. APPEND item TO hs_header-items. INSERT table hs_header. ENDIF. ENDLOOP. LOOP AT hs_header. CLEAR it_out. it_out-ebeln = hs_header-ebeln. LOOP AT hs_header-items INTO item. CONCATENATE it_out-lines ',' item-ebelp INTO it_out-lines. ENDLOOP. APPEND it_out. ENDLOOP. GET RUN TIME FIELD t2. t1 = t2 - t1. WRITE / t1. |
最后得出结论:实践出真知,验证之后才知道真正的结果。
流传于ABAP之间的join 不能超过几个表等缪传坑害不少人啊,不能同的情况有不同的优化方案,所以遇到问题时,别急着相信别人的答案,自己先run一下吧。
上面代码出自老白之手,在此声明。