Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
4byte
Moin D&P,DeathAndPain hat geschrieben:Dann braucht man nämlich bei der neuen Syntax den hässlichen TRY...CATCH...ENDTRY-Block aus der Objektorientierung
[...]
Da sieht man mal, was für einen hohen Rechenzeitpreis man bezahlt, wenn man dieses objektorientierte Geraffel einsetzt.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Haubi
Code: Alles auswählen.
DATA(ls_alv) = VALUE ts_alv( key = <ls_epdproda>-keyattr
attrid = <ls_epdproda>-attrid
parameter = COND #( WHEN <ls_epdproda>-evaltype EQ 'P'
THEN <ls_epdproda>-value
ELSE space )
value = me->as_value_for_output( iv_rollname = <ls_epdproda>-datatype
iv_value = me->get_value_from_attrid( iv_node = <ls_epdproda>-node
iv_attrid = <ls_epdproda>-attrid ) )
descript = <ls_epdproda>-scrtext_l
style = VALUE #( ( fieldname = 'VALUE'
style = COND #( WHEN <ls_epdproda>-evaltype NE 'P'
OR ( <ls_epdproda>-create_only EQ abap_true
AND me->mr_gui->mo_tree->get_node_properties( <ls_epdproda>-node )-aemode EQ lcl_tree=>mc_node_update )
OR gv_mode EQ lcl_gui=>mc_mode_show
OR ( <ls_epdproda>-evaltype EQ 'P'
AND me->get_status_from_parameter( <ls_epdproda>-value ) EQ lcl_tree=>mc_node_done )
THEN COND #( WHEN me->is_attrid_checkbox( iv_node = <ls_epdproda>-node
iv_attrid = <ls_epdproda>-attrid ) EQ abap_true
THEN COND #( WHEN me->get_value_from_attrid( iv_node = <ls_epdproda>-node
iv_attrid = <ls_epdproda>-attrid ) EQ abap_true
THEN alv_style_checkbox_checked + cl_gui_alv_grid=>mc_style_disabled
ELSE alv_style_checkbox_not_checked + cl_gui_alv_grid=>mc_style_disabled )
ELSE cl_gui_alv_grid=>mc_style_disabled )
ELSE COND #( WHEN me->mr_gui->mo_tree->read_node_status( <ls_epdproda>-node ) EQ abap_true
AND <ls_epdproda>-oblig EQ abap_true
AND <ls_epdproda>-keyattr NE abap_true
AND me->is_attrid_checkbox( iv_node = <ls_epdproda>-node
iv_attrid = <ls_epdproda>-attrid ) NE abap_true
AND me->get_value_from_attrid( iv_node = <ls_epdproda>-node
iv_attrid = <ls_epdproda>-attrid ) IS INITIAL
THEN alv_style_color_negative + cl_gui_alv_grid=>mc_style_enabled + alv_style_f4
WHEN me->mr_gui->mo_tree->read_node_status( <ls_epdproda>-node ) EQ abap_undefined
AND ( <ls_epdproda>-execution EQ abap_true
OR <ls_epdproda>-keyattr EQ abap_true )
THEN alv_style_color_total + cl_gui_alv_grid=>mc_style_enabled + alv_style_f4
ELSE COND #( WHEN me->is_attrid_checkbox( iv_node = <ls_epdproda>-node
iv_attrid = <ls_epdproda>-attrid ) EQ abap_true
THEN COND #( WHEN me->get_value_from_attrid( iv_node = <ls_epdproda>-node
iv_attrid = <ls_epdproda>-attrid ) EQ abap_true
THEN alv_style_checkbox_checked + cl_gui_alv_grid=>mc_style_enabled
ELSE alv_style_checkbox_not_checked + cl_gui_alv_grid=>mc_style_enabled )
ELSE cl_gui_alv_grid=>mc_style_enabled + alv_style_f4 ) ) ) )
( fieldname = 'DESCRIPT'
style = cl_gui_alv_grid=>mc_style_disabled ) ) ).Code: Alles auswählen.
*DATA persons TYPE standard TABLE OF pa0000 WITH DEFAULT KEY.
DATA persons TYPE SORTED TABLE OF pa0000 WITH UNIQUE KEY pernr endda .
*DATA persons TYPE SORTED TABLE OF pa0000 WITH UNIQUE KEY pernr subty objps sprps endda begda seqnr.
CLASS lcx_test DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.
START-OF-SELECTION.
SELECT * FROM pa0000 INTO TABLE persons up to 1 rows.
DATA(person) = persons[ 1 ].
DO 1000000 TIMES.
person-pernr = sy-index.
INSERT person INTO TABLE persons.
ENDDO.
PERFORM a1.
PERFORM a2.
PERFORM a3.
FORM a1.
GET RUN TIME FIELD DATA(start).
TRY.
person = persons[ pernr = '12345678' endda = '99981231' ].
CATCH cx_sy_itab_line_not_found.
ENDTRY.
GET RUN TIME FIELD DATA(stopp).
DATA(diff) = stopp - start.
WRITE: / '1:', diff.
ENDFORM.
FORM a2.
GET RUN TIME FIELD DATA(start).
TRY.
READ TABLE persons WITH KEY pernr = '12345678' endda = '99981231' TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE lcx_test.
ENDIF.
CATCH lcx_test.
GET RUN TIME FIELD DATA(stopp).
DATA(diff) = stopp - start.
WRITE: / '2:', diff.
ENDTRY.
ENDFORM.
FORM a3.
GET RUN TIME FIELD DATA(start).
ASSIGN persons[ pernr = '12345678' endda = '99981231' ] TO FIELD-SYMBOL(<person>).
IF sy-subrc <> 0.
ENDIF.
GET RUN TIME FIELD DATA(stopp).
DATA(diff) = stopp - start.
WRITE: / '3:', diff.
ENDFORM.
Code: Alles auswählen.
data:
lr_car type ref to zcl_car
lr_object type ref to object.
try.
lr_car ?= lr_object.
catch cx_sy_move_cast_error.
" ... Kein Auto
endtry.Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ralf.wenzel
Du meinst, weil es sich bei der Ausnahme CX_SY_ITAB_LINE_NOT_FOUND, um die es hier geht, nicht um eine Klasse handelt, die nicht von einer Oberklasse erbt, die nicht von einer Oberklasse erbt... Das ist schon was ganz anderes als etwa eine Ausnahme eines Funktionsbausteins, und zwar offensichtlich auch von der Rechenzeit her.black_adept hat geschrieben:Moin D&P,DeathAndPain hat geschrieben:Dann braucht man nämlich bei der neuen Syntax den hässlichen TRY...CATCH...ENDTRY-Block aus der Objektorientierung
[...]
Da sieht man mal, was für einen hohen Rechenzeitpreis man bezahlt, wenn man dieses objektorientierte Geraffel einsetzt.
Ein Try-Catch-Block ist eine Ausnahmebehandlung. Und die hat mitnichten etwas mit Objektorientierung zu tun sondern ist ein ganz allgemeines Programmierkonzept. Wenn du kein OO magst ist das ja deine Sache und du darfst auch gerne über schlechte Performanz von neuen Sprachelementen meckern. Aber bitte nicht so darstellen bloß um OO schlecht dastehen zu lassen.
Ich finde Deinen Code unglücklich, weil Du jeweils nur eine einzige Ausführung misst, wodurch so kleine Werte entstehen, dass der Rundungsfaktor erheblich wird. Dennoch komme ich auch mit Deinem Code auf meinem System zu folgenden Werten (mehrfach ausgeführt; war in etwa immer auf dem Niveau):ewx hat geschrieben:Ich habe in den zweiten READ auch eine Exception eingebaut. Das ändert nichts (messbares) an der Laufzeit.
Code: Alles auswählen.
1: 87
2: 11
3: 1Richtig. Je nach Anwendung kann es völlig bedeutungslos oder sehr erheblich sein, dass Anweisungen das Siebenfache der Laufzeit benötigen. Ich wollte ja nur darauf hinweisen, dass es diesen u.U. ganz erheblichen Preis gibt.Ralf hat geschrieben:Zumal mich überhaupt nicht wundert, wenn OO-Coding grundsätzlich mehr Performance braucht, es gibt ja einen entsprechenden Overhead. Ich gehe deshalb auch davon aus, dass mehr Speicher benötigt wird.
Ich habe noch nie wen behaupten hören, dass dem nicht so ist. Der Schwerpunkt bei OO ist ja ein anderer. Würden wir den Fokus nur auf die Laufzeit setzen, müssten wir in Assembler programmieren und hätten erheblich mehr Aufwände.
Das ist richtig und doch nur die halbe Wahrheit, denn dass eine Tabellenzeile, die man zu lesen versucht, nicht existiert, ist in vielen realen Programmen mitnichten ein "absoluter Fehlerfall".adt hat geschrieben:Warum das TRY...CATCH-Beispiel soviel mehr an Laufzeit braucht ist rasch erklärt:
Es handelt sich um eine Ausnahme und da muss der Kernel die aktuelle Verarbeitung unterbrechen, alle Informationen (Speicherabbild usw.) sammeln und eine teure "Sprung"-Operation zum CATCH-Block durchführen.
Deswegen nimmt man so ein Konstrukt ja auch nicht für den Standardanwendungfall (hier "Prüfen ob vorhanden") sondern für den absoluten Fehlerfall, wo man nicht mehr anders kann als den Programmabschnitt zu verlassen.
Genau dafür hat die SAP ja auch den LINE_EXISTS eingeführt, dass eben KEINE Exception ausgelöst wird.

Du bist im falschen Thread. Hier geht es um das vollwertige Lesen von Tabellenzeilen, nicht nur um deren Existenzprüfung.Doch, natürlich reicht ein LINE_EXISTS - solange du nicht in der Bedingung einen weiteren Tabellenausdruck hast, der eigentlich einen eigenen LINE_EXISTS braucht.


