雙重loop迴圈時第二個loop用where…
阿新 • • 發佈:2019-01-03
用se30的時候,看到一段雙重loop的程式碼,自己寫了個例子測試了下
第二層loop不要用where判斷,會慢
直接使用他的index
程式碼如下
*&---------------------------------------------------------------------*
*& Report ZLM_TEST001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zlm_test001.
DATA: t0 TYPE i,
t1 TYPE i,
t2 TYPE i,
t3 TYPE i,
t4 TYPE i,
t5 TYPE i,
t6 TYPE i,
tm TYPE i.
DATA:
BEGIN OF str_data,
id TYPE int4,
name TYPE string,
END OF str_data.
DATA:
l_dex TYPE int4.
DATA:
l_it_1 LIKE TABLE OF str_data WITH KEY id WITH HEADER LINE,
l_it_2 LIKE TABLE OF str_data WITH KEY id WITH HEADER LINE.
GET RUN TIME FIELD t1.
DO 10000 TIMES.
l_it_1-id = sy-index.
l_it_1-name = sy-index.
APPEND l_it_1.
l_it_2-id = sy-index.
l_it_2-name = sy-index.
APPEND l_it_2.
ENDDO.
GET RUN TIME FIELD t2.
t3 = t2 - t1.
WRITE t3.
SKIP.
CLEAR:t1,t2,t3,t4.
"紀錄當前時間
GET RUN TIME FIELD t1.
"相對比的欄位 排序
SORT l_it_1 BY id .
SORT l_it_2 BY id .
GET RUN TIME FIELD t1.
LOOP AT l_it_2 .
LOOP AT l_it_1 WHERE id = l_it_2-id.
EXIT.
ENDLOOP.
ENDLOOP.
GET RUN TIME FIELD t2.
GET RUN TIME FIELD t3.
*--------------------------------------------------------------------*
l_dex = 1.
LOOP AT l_it_2 .
LOOP AT l_it_1 FROM l_dex.
IF l_it_1-id = l_it_2-id.
l_dex = l_dex + 1.
EXIT.
ELSE.
CONTINUE.
ENDIF.
" ...
ENDLOOP.
ENDLOOP.
GET RUN TIME FIELD t4.
t5 = t2 - t1.
t6 = t4 - t3.
WRITE:/ '使用where用時:', t5.
WRITE:/ '使用index用時',t6.
tm = t6 - t5.
WRITE:/ 'index - where',tm. 執行結果 其實原因,我自己的理解是: 第一種情況用了where,本質還是全部迴圈了。 第二種,我是用index,找到了就continue,最優是1,最差是N,這個複雜度大家應該也知道。 但是很多時候,loop套用loop的時候,第二層還是使用where的居多。 如果沒有對效能上特別要求,應該沒必要修改, 如果數量太大,而效能受到了嚴重影響的時候, 可以在優化其他的時候,試著修改下多層loop裡的演算法。
*& Report ZLM_TEST001
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zlm_test001.
DATA: t0 TYPE i,
t1 TYPE
t2 TYPE i,
t3 TYPE i,
t4 TYPE i,
t5 TYPE i,
t6 TYPE i,
tm TYPE i.
DATA:
BEGIN OF str_data,
id TYPE int4,
name TYPE string,
END OF str_data.
DATA:
l_dex TYPE int4.
DATA:
l_it_1 LIKE TABLE OF str_data WITH KEY id WITH HEADER LINE,
l_it_2 LIKE
GET RUN TIME FIELD t1.
DO 10000 TIMES.
l_it_1-id = sy-index.
l_it_1-name = sy-index.
APPEND l_it_1.
l_it_2-id = sy-index.
l_it_2-name = sy-index.
APPEND l_it_2.
ENDDO.
GET RUN TIME FIELD t2.
t3 = t2 - t1.
WRITE t3.
SKIP.
CLEAR:t1,t2,t3,t4.
"紀錄當前時間
GET
"相對比的欄位 排序
SORT l_it_1 BY id .
SORT l_it_2 BY id .
GET RUN TIME FIELD t1.
LOOP AT l_it_2 .
LOOP AT l_it_1 WHERE id = l_it_2-id.
EXIT.
ENDLOOP.
ENDLOOP.
GET RUN TIME FIELD t2.
GET RUN TIME FIELD t3.
*--------------------------------------------------------------------*
l_dex = 1.
LOOP AT l_it_2 .
LOOP AT l_it_1 FROM l_dex.
IF l_it_1-id = l_it_2-id.
l_dex = l_dex + 1.
EXIT.
ELSE.
CONTINUE.
ENDIF.
" ...
ENDLOOP.
ENDLOOP.
GET RUN TIME FIELD t4.
t5 = t2 - t1.
t6 = t4 - t3.
WRITE:/ '使用where用時:', t5.
WRITE:/ '使用index用時',t6.
tm = t6 - t5.
WRITE:/ 'index - where',tm. 執行結果 其實原因,我自己的理解是: 第一種情況用了where,本質還是全部迴圈了。 第二種,我是用index,找到了就continue,最優是1,最差是N,這個複雜度大家應該也知道。 但是很多時候,loop套用loop的時候,第二層還是使用where的居多。 如果沒有對效能上特別要求,應該沒必要修改, 如果數量太大,而效能受到了嚴重影響的時候, 可以在優化其他的時候,試著修改下多層loop裡的演算法。