nein.DeathAndPain hat geschrieben:Dein eigener Beispielcode hat doch das Gegenteil bewiesen, ewx.
Das stellt ja auch keiner in Frage.DeathAndPain hat geschrieben:Ich habe meine Messergebnisse damit ja gepostet. Der READ TABLE ist das performanteste, was Du machen kannst.
Code: Alles auswählen.
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.
ENDTRY.
Code: Alles auswählen.
FORM a4.
GET RUN TIME FIELD DATA(start).
READ TABLE persons WITH KEY pernr = '12345678' endda = '99981231' TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
GET RUN TIME FIELD DATA(stopp).
DATA(diff) = stopp - start.
WRITE: / '4:', diff.
ENDIF.
ENDFORM.
Das wäre immer noch rasch mal das Doppelte. Wobei wir bei solchen Zahlenwerten natürlich die Rundung massiv mit drin haben. Vielleicht zeigt er ja schon 1 an, wenn nur 0,1 vergangen sind (übrigens Mikrosekunden und nicht wie von Dir gepostet ms; so erbärmlich performt ABAP denn doch nicht ). Deshalb wäre es gut, wenn Du Dein Programm so umbauen würdest, dass der Tabellenzugriff 1000x ausgeführt wird, damit eine nennenswerte Laufzeit entsteht. Dann geht die Performance des DO 1000 TIMES-Befehls natürlich in die Rechnung mit ein, allerdings als konstanter Faktor, so dass die Messergebnisse durchaus eine Interpretation erlauben. Überdies könnte man den DO 1000 TIMES hinterher noch einmal mit leerem Inhalt messen und seine Dauer von der Dauer der übrigen Messläufe jeweils abziehen.Bei dir scheint der Unterschied massiver zu sein, als bei mir:
Bei mir macht der Raise etwa das doppelte der Laufzeit aus. (1-2 ms zu 3-4 ms).
Dazu hatte ich weiter oben auch schon was gepostet. Der Inline Read ist nicht nennenswert langsamer als der READ TABLE, es sei denn, es gibt die Tabellenzeile nicht, so dass er in den CATCH läuft. Gerade aus diesem Umstand ergibt sich der Schluss, dass die Performance in der Ausnahmeklasse verschwindet. Ersetzt man die mehrfach untervererbte Ausnahmeklasse CX_SY_ITAB_LINE_NOT_FOUND durch eine Primitivklasse, wie Du es in FORM a2 tust, dann ist die Laufzeit schon ein ganzes Stück besser, obwohl Du in a2 noch den IF auf den SY-SUBRC mitmisst. Lässt man die Klassen ganz weg, dann steigt die Performance nochmals um eine ganze Größenordnung an.Bei mir macht der Raise etwa das doppelte der Laufzeit aus. (1-2 ms zu 3-4 ms).
Jedoch definitiv nicht so lange wie der "inline read" mit 10 - 17 ms.
Das wäre aber mies von der SAP gecodet, wenn der READ TABLE ohne Schlüssel nennenswert schneller sucht als der Inline Read ohne Schlüssel. Und wenn das so sein sollte, dann könnte es genauso sein, dass der READ TABLE mit Schlüssel schneller sucht als der Inline Read. Tatsächlich habe ich den READ TABLE in meinen Messungen (wie eingangs gepostet) ja auch reproduzierbar vorne, freilich nur mit so geringen Geschwindigkeitsunterschieden, dass man es in der Praxis vernachlässigen kann. Gravierend werden die Performanceunterschiede erst dann, wenn die Zeile nicht gefunden wird, weil das den READ TABLE kaum juckt, während jede Form von Coding, das auf eine Ausnahme setzt, dann um ein Vielfaches langsamer performt.Richtig, aber es könnte sein, dass die 7.40-Variante ohne Schlüssel weniger effizient ist. Bei deinem Coding ist das egal, sortierte Tabelle mit Schlüssel....