Use of reference variable vs workarea vs field symbols - kazumov/abap GitHub Wiki

Source

REPORT  ztest_np_loop_reference.
 
*
DATA: i_bseg TYPE STANDARD TABLE OF bseg,
      wa_bseg LIKE LINE OF i_bseg.
*
DATA: lv_flag TYPE flag,
      lv_sta_time TYPE timestampl,
      lv_end_time TYPE timestampl,
      lv_diff_w   TYPE p DECIMALS 5,
      lv_diff_f   LIKE lv_diff_w,
      lv_diff_r   LIKE lv_diff_w,
      lv_save     LIKE lv_diff_w.
*
FIELD-SYMBOLS: <fs_bseg> LIKE LINE OF i_bseg.
 
DATA: o_bseg TYPE REF TO bseg.
*
* data selection = 10,000 records
SELECT * FROM bseg INTO TABLE i_bseg UP TO 100 ROWS.
*
* Begin - Processing with Work area
GET TIME STAMP FIELD lv_sta_time.
LOOP AT i_bseg INTO wa_bseg.
  IF lv_flag = 'X'.
    wa_bseg-sgtxt = 'TEST'.
    MODIFY i_bseg FROM wa_bseg.
  ENDIF.
  CLEAR wa_bseg.
  IF lv_flag IS INITIAL.
    lv_flag = 'X'.
  ENDIF.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_w = lv_end_time - lv_sta_time.
WRITE: /(30) 'Work area', lv_diff_w.
* End   - Processing with Work Area
*
CLEAR: lv_flag,
       lv_sta_time,
       lv_end_time.
* Begin - Processing with Field-Symbols
GET TIME STAMP FIELD lv_sta_time.
LOOP AT i_bseg ASSIGNING <fs_bseg>.
  IF lv_flag = 'X'.
    <fs_bseg>-sgtxt = 'TEST'.
  ENDIF.
  IF lv_flag IS INITIAL.
    lv_flag = 'X'.
  ENDIF.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_f = lv_end_time - lv_sta_time.
WRITE: /(30) 'Field-Symbol', lv_diff_f.
* End   - Processing with FS
*
* Net time saving
lv_save = lv_diff_w - lv_diff_f.
WRITE: /(30) 'Total Save (FS-WA)', lv_save.
*
CLEAR: lv_flag,
       lv_sta_time,
       lv_end_time.
* Begin - Processing with Field-Symbols
GET TIME STAMP FIELD lv_sta_time.
LOOP AT i_bseg REFERENCE INTO o_bseg.
  IF lv_flag = 'X'.
    o_bseg->sgtxt = 'TEST'.
  ENDIF.
  IF lv_flag IS INITIAL.
    lv_flag = 'X'.
  ENDIF.
ENDLOOP.
GET TIME STAMP FIELD lv_end_time.
lv_diff_r = lv_end_time - lv_sta_time.
WRITE: /(30) 'Reference', lv_diff_r.
* End   - Processing with FS
*
* Net time saving
lv_save = lv_diff_f - lv_diff_r.
WRITE: /(30) 'Total Save(Ref-FS)', lv_save.
 
WRITE: / 'Done'.

The result:

Records Workarea Field-Symbol Reference
100 100 17.50 23.75
1000 100 20.11 21.52
10000 100 19.97 23.77
⚠️ **GitHub.com Fallback** ⚠️