From 66e4ef4793406f2a1289bd71c65a137014781a3b Mon Sep 17 00:00:00 2001 From: Bilen Date: Tue, 20 Mar 2018 09:32:36 +0800 Subject: [PATCH 1/5] Performance update for iterator Iterator is slowing down for read operations, row class reference is now stored in hash table rather than iterator. --- src/zcl_excel_rows.clas.abap | 171 ++++++++++++++++++++++++++--------- 1 file changed, 127 insertions(+), 44 deletions(-) diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap index c1cf0f1..f7dfc06 100644 --- a/src/zcl_excel_rows.clas.abap +++ b/src/zcl_excel_rows.clas.abap @@ -3,45 +3,54 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -class ZCL_EXCEL_ROWS definition - public - final - create public . +CLASS ZCL_EXCEL_ROWS DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + *"* public components of class ZCL_EXCEL_ROWS *"* do not include other source files here!!! *"* protected components of class ZABAP_EXCEL_WORKSHEETS *"* do not include other source files here!!! -public section. + PUBLIC SECTION. + TYPES: + BEGIN OF T_ROWS, + ROW_INDEX TYPE INT4, + ROW TYPE REF TO ZCL_EXCEL_ROW, + END OF T_ROWS. - methods ADD - importing - !IO_ROW type ref to ZCL_EXCEL_ROW . - methods CLEAR . - methods CONSTRUCTOR . - methods GET - importing - !IP_INDEX type I - returning - value(EO_ROW) type ref to ZCL_EXCEL_ROW . - methods GET_ITERATOR - returning - value(EO_ITERATOR) type ref to CL_OBJECT_COLLECTION_ITERATOR . - methods IS_EMPTY - returning - value(IS_EMPTY) type FLAG . - methods REMOVE - importing - !IO_ROW type ref to ZCL_EXCEL_ROW . - methods SIZE - returning - value(EP_SIZE) type I . + DATA: + DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX. + + METHODS ADD + IMPORTING + !IO_ROW TYPE REF TO ZCL_EXCEL_ROW . + METHODS CLEAR . + METHODS CONSTRUCTOR . + METHODS GET + IMPORTING + !IP_INDEX TYPE I + RETURNING + VALUE(EO_ROW) TYPE REF TO ZCL_EXCEL_ROW . + METHODS GET_ITERATOR + RETURNING + VALUE(EO_ITERATOR) TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR . + METHODS IS_EMPTY + RETURNING + VALUE(IS_EMPTY) TYPE FLAG . + METHODS REMOVE + IMPORTING + !IO_ROW TYPE REF TO ZCL_EXCEL_ROW . + METHODS SIZE + RETURNING + VALUE(EP_SIZE) TYPE I . PROTECTED SECTION. *"* private components of class ZABAP_EXCEL_RANGES *"* do not include other source files here!!! PRIVATE SECTION. - DATA rows TYPE REF TO cl_object_collection . + DATA ROWS TYPE REF TO CL_OBJECT_COLLECTION . ENDCLASS. @@ -49,44 +58,118 @@ ENDCLASS. CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. - METHOD add. - rows->add( io_row ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->ADD +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + METHOD ADD. +* IF SY-UNAME = 'BILEN'. + DATA: + LS_ROW TYPE T_ROWS. + LS_ROW-ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). + LS_ROW-ROW = IO_ROW. + INSERT LS_ROW INTO TABLE DT_ROWS. +* +* ELSE. +* ROWS->ADD( IO_ROW ). +* +* ENDIF. + ENDMETHOD. "ADD - METHOD clear. - rows->clear( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->CLEAR +* +-------------------------------------------------------------------------------------------------+ +* +-------------------------------------------------------------------------------------- + METHOD CLEAR. +* ROWS->CLEAR( ). + CLEAR DT_ROWS[]. + ENDMETHOD. "CLEAR - METHOD constructor. +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->CONSTRUCTOR +* +-------------------------------------------------------------------------------------------------+ +* +-------------------------------------------------------------------------------------- + METHOD CONSTRUCTOR. - CREATE OBJECT rows. + CREATE OBJECT ROWS. ENDMETHOD. "CONSTRUCTOR - METHOD get. - eo_row ?= rows->if_object_collection~get( ip_index ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->GET +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IP_INDEX TYPE I +* | [<-()] EO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + METHOD GET. +* IF SY-UNAME = 'BILEN'. + READ TABLE DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_INDEX. + IF SY-SUBRC = 0. + EO_ROW ?= -ROW. + ENDIF. +* ELSE. +* EO_ROW ?= ROWS->IF_OBJECT_COLLECTION~GET( IP_INDEX ). +* +* ENDIF. ENDMETHOD. "GET - METHOD get_iterator. - eo_iterator ?= rows->if_object_collection~get_iterator( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->GET_ITERATOR +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] EO_ITERATOR TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR +* +-------------------------------------------------------------------------------------- + METHOD GET_ITERATOR. + EO_ITERATOR ?= ROWS->IF_OBJECT_COLLECTION~GET_ITERATOR( ). ENDMETHOD. "GET_ITERATOR - METHOD is_empty. - is_empty = rows->if_object_collection~is_empty( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] IS_EMPTY TYPE FLAG +* +-------------------------------------------------------------------------------------- + METHOD IS_EMPTY. + DATA(LV_LINES) = LINES( DT_ROWS ). + + IF LV_LINES = 0. + IS_EMPTY = 'X'. + ELSE. + IS_EMPTY = ' '. + ENDIF. +* IS_EMPTY = ROWS->IF_OBJECT_COLLECTION~IS_EMPTY( ). ENDMETHOD. "IS_EMPTY - METHOD remove. - rows->remove( io_row ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->REMOVE +* +-------------------------------------------------------------------------------------------------+ +* | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW +* +-------------------------------------------------------------------------------------- + METHOD REMOVE. +* ROWS->REMOVE( IO_ROW ). + DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). ENDMETHOD. "REMOVE - METHOD size. - ep_size = rows->if_object_collection~size( ). +* ---------------------------------------------------------------------------------------+ +* | Instance Public Method ZCL_EXCEL_ROWS->SIZE +* +-------------------------------------------------------------------------------------------------+ +* | [<-()] EP_SIZE TYPE I +* +-------------------------------------------------------------------------------------- + METHOD SIZE. +* IF sy-uname = 'BILEN'. + EP_SIZE = LINES( DT_ROWS ).. +* +* else. +* EP_SIZE = ROWS->IF_OBJECT_COLLECTION~SIZE( ). +* +* ENDIF. ENDMETHOD. "SIZE ENDCLASS. From cb1364b65f604427a1b5a6443e1d5fb21f285eac Mon Sep 17 00:00:00 2001 From: Bilen Date: Tue, 20 Mar 2018 20:50:10 +0800 Subject: [PATCH 2/5] Update zcl_excel_rows.clas.abap --- src/zcl_excel_rows.clas.abap | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap index f7dfc06..2894a42 100644 --- a/src/zcl_excel_rows.clas.abap +++ b/src/zcl_excel_rows.clas.abap @@ -15,7 +15,7 @@ CLASS ZCL_EXCEL_ROWS DEFINITION *"* do not include other source files here!!! PUBLIC SECTION. TYPES: - BEGIN OF T_ROWS, + BEGIN OF T_ROWS, " performance improvement #527 ROW_INDEX TYPE INT4, ROW TYPE REF TO ZCL_EXCEL_ROW, END OF T_ROWS. @@ -64,17 +64,12 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. * | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW * +-------------------------------------------------------------------------------------- METHOD ADD. -* IF SY-UNAME = 'BILEN'. + DATA: LS_ROW TYPE T_ROWS. LS_ROW-ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). LS_ROW-ROW = IO_ROW. INSERT LS_ROW INTO TABLE DT_ROWS. -* -* ELSE. -* ROWS->ADD( IO_ROW ). -* -* ENDIF. ENDMETHOD. "ADD @@ -84,7 +79,6 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. * +-------------------------------------------------------------------------------------------------+ * +-------------------------------------------------------------------------------------- METHOD CLEAR. -* ROWS->CLEAR( ). CLEAR DT_ROWS[]. ENDMETHOD. "CLEAR @@ -108,15 +102,10 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. * | [<-()] EO_ROW TYPE REF TO ZCL_EXCEL_ROW * +-------------------------------------------------------------------------------------- METHOD GET. -* IF SY-UNAME = 'BILEN'. READ TABLE DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_INDEX. IF SY-SUBRC = 0. EO_ROW ?= -ROW. ENDIF. -* ELSE. -* EO_ROW ?= ROWS->IF_OBJECT_COLLECTION~GET( IP_INDEX ). -* -* ENDIF. ENDMETHOD. "GET @@ -143,7 +132,6 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. ELSE. IS_EMPTY = ' '. ENDIF. -* IS_EMPTY = ROWS->IF_OBJECT_COLLECTION~IS_EMPTY( ). ENDMETHOD. "IS_EMPTY @@ -153,7 +141,6 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. * | [--->] IO_ROW TYPE REF TO ZCL_EXCEL_ROW * +-------------------------------------------------------------------------------------- METHOD REMOVE. -* ROWS->REMOVE( IO_ROW ). DELETE DT_ROWS WHERE ROW_INDEX = IO_ROW->GET_ROW_INDEX( ). ENDMETHOD. "REMOVE @@ -164,12 +151,6 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. * | [<-()] EP_SIZE TYPE I * +-------------------------------------------------------------------------------------- METHOD SIZE. -* IF sy-uname = 'BILEN'. EP_SIZE = LINES( DT_ROWS ).. -* -* else. -* EP_SIZE = ROWS->IF_OBJECT_COLLECTION~SIZE( ). -* -* ENDIF. ENDMETHOD. "SIZE ENDCLASS. From 2f8b93f2a5869eee6e277a73a7971bbd72b1d2c6 Mon Sep 17 00:00:00 2001 From: Bilen Date: Tue, 20 Mar 2018 20:53:53 +0800 Subject: [PATCH 3/5] performance improvement for GET_ROW Iterator logic removed and hash table logic inserted to the GET_ROW method. --- src/zcl_excel_worksheet.clas.abap | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/zcl_excel_worksheet.clas.abap b/src/zcl_excel_worksheet.clas.abap index 8a57774..21b6173 100644 --- a/src/zcl_excel_worksheet.clas.abap +++ b/src/zcl_excel_worksheet.clas.abap @@ -4098,20 +4098,14 @@ method GET_RANGES_ITERATOR. METHOD get_row. - DATA: lo_row_iterator TYPE REF TO cl_object_collection_iterator, - lo_row TYPE REF TO zcl_excel_row. +* performance improvement for issue #527 + READ TABLE ROWS->DT_ROWS ASSIGNING FIELD-SYMBOL() WITH TABLE KEY ROW_INDEX = IP_ROW. + IF SY-SUBRC = 0. + EO_ROW = -ROW. + ENDIF. - lo_row_iterator = me->get_rows_iterator( ). - WHILE lo_row_iterator->has_next( ) = abap_true. - lo_row ?= lo_row_iterator->get_next( ). - IF lo_row->get_row_index( ) = ip_row. - eo_row = lo_row. - EXIT. - ENDIF. - ENDWHILE. - - IF eo_row IS NOT BOUND. - eo_row = me->add_new_row( ip_row ). + IF EO_ROW IS NOT BOUND. + EO_ROW = ME->ADD_NEW_ROW( IP_ROW ). ENDIF. ENDMETHOD. From 4917b88a77ad2f75c22adb4bc5d3a1295d09c217 Mon Sep 17 00:00:00 2001 From: Ivan Date: Tue, 20 Mar 2018 22:10:45 -0500 Subject: [PATCH 4/5] Update zcl_excel_rows.clas.abap --- src/zcl_excel_rows.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap index 2894a42..727b4d0 100644 --- a/src/zcl_excel_rows.clas.abap +++ b/src/zcl_excel_rows.clas.abap @@ -128,9 +128,9 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. DATA(LV_LINES) = LINES( DT_ROWS ). IF LV_LINES = 0. - IS_EMPTY = 'X'. + IS_EMPTY = abap_true. ELSE. - IS_EMPTY = ' '. + IS_EMPTY = abap_false. ENDIF. ENDMETHOD. "IS_EMPTY From bc44a6c7c9424d7eda419d3015b31f7e8abcb49b Mon Sep 17 00:00:00 2001 From: Ivan Date: Wed, 21 Mar 2018 16:15:51 -0500 Subject: [PATCH 5/5] Update zcl_excel_rows.clas.abap --- src/zcl_excel_rows.clas.abap | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/zcl_excel_rows.clas.abap b/src/zcl_excel_rows.clas.abap index 727b4d0..5ef7600 100644 --- a/src/zcl_excel_rows.clas.abap +++ b/src/zcl_excel_rows.clas.abap @@ -21,7 +21,7 @@ CLASS ZCL_EXCEL_ROWS DEFINITION END OF T_ROWS. DATA: - DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX. + DT_ROWS TYPE HASHED TABLE OF T_ROWS WITH UNIQUE KEY ROW_INDEX READ-ONLY. METHODS ADD IMPORTING @@ -33,9 +33,6 @@ CLASS ZCL_EXCEL_ROWS DEFINITION !IP_INDEX TYPE I RETURNING VALUE(EO_ROW) TYPE REF TO ZCL_EXCEL_ROW . - METHODS GET_ITERATOR - RETURNING - VALUE(EO_ITERATOR) TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR . METHODS IS_EMPTY RETURNING VALUE(IS_EMPTY) TYPE FLAG . @@ -109,16 +106,6 @@ CLASS ZCL_EXCEL_ROWS IMPLEMENTATION. ENDMETHOD. "GET -* ---------------------------------------------------------------------------------------+ -* | Instance Public Method ZCL_EXCEL_ROWS->GET_ITERATOR -* +-------------------------------------------------------------------------------------------------+ -* | [<-()] EO_ITERATOR TYPE REF TO CL_OBJECT_COLLECTION_ITERATOR -* +-------------------------------------------------------------------------------------- - METHOD GET_ITERATOR. - EO_ITERATOR ?= ROWS->IF_OBJECT_COLLECTION~GET_ITERATOR( ). - ENDMETHOD. "GET_ITERATOR - - * ---------------------------------------------------------------------------------------+ * | Instance Public Method ZCL_EXCEL_ROWS->IS_EMPTY * +-------------------------------------------------------------------------------------------------+