Datumsfunktion mit schlechter Performance

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Datumsfunktion mit schlechter Performance

Beitrag von DHE (ForumUser / 10 / 4 / 0 ) »
Hallo zusammen,

ich habe eine von mir geschriebene Anwendung getracet (SAT) und mir sind folgende Einträge in der Ergebnisliste aufgefallen:

5,18 Perform FIRSTWEEK
3,33 Perform LASTWEEK
2,94 Call Function DATE_GET_WEEK
2,83 Call Function MC_PERIODE_ZUM_DATUM
2,8 Perform THISYEAR
2,7 Call M. {O:24*CL_CAL_DEF_CALLER_DYNAMIC}->IF_CALENDAR_DEFINITION~GET_DATE_IN_FIRST_WEEK
2,45 Call M. {O:24*CL_CAL_DEF_CALLER_DYNAMIC}->IF_CALENDAR_DEFINITION~GET_FIRST_DAY_OF_WEEK
1,75 Call M. {O:23*CL_ISO_CALENDAR_DEFINITION}->IF_CALENDAR_DEFINITION~GET_DATE_IN_FIRST_WEEK
1,43 Call M. {O:23*CL_ISO_CALENDAR_DEFINITION}->IF_CALENDAR_DEFINITION~GET_FIRST_DAY_OF_WEEK
1,35 Call M. CL_CALENDAR_DEFINITION_CALLER=>IF_CALENDAR_DEFINITION~GET_DATE_IN_FIRST_WEEK
1,34 Call M. CL_CALENDAR_DEFINITION_CALLER=>IF_CALENDAR_DEFINITION~GET_DATE_IN_FIRST_WEEK
1,16 Call M. CL_CALENDAR_DEFINITION_CALLER=>IF_CALENDAR_DEFINITION~GET_FIRST_DAY_OF_WEEK
1,15 Call M. CL_CALENDAR_DEFINITION_CALLER=>IF_CALENDAR_DEFINITION~GET_FIRST_DAY_OF_WEEK

(Netto-Prozent von der Gesamtlaufzeit, Summe: 30,4 %)

Aktiv rufe ich nur den Funktionsbaustein MC_PERIODE_ZUM_DATUM. Dieser ruft DATE_GET_WEEK, dieser wiederum FIRSTWEEK, LASTWEEK, THISYEAR. Darin werden dann die Badimethoden aufgerufen, die noch in dieser Liste stehen.

Das Programm arbeit viel mit Perioden, sodass der MC Baustein im Loop für viele Perioden und viele Materialien aufgerufen wird.

Meine Frage: gibt es einen performanteren Weg oder die Möglichkeit die Daten zwischenzuspeichern, so dass ich hier Zeit sparen kann?

Danke im Voraus und freundliche Grüße
Grüße,
Dominic

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Datumsfunktion mit schlechter Performance

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Hab mir das vor ein paar Jahren aus dem Internet zusammengesucht und mir meine eigene Routine geschrieben:

Laut ISO 8601:

Der Beginn der ersten Kalenderwoche eines Jahres hängt vom Wochentag ab, auf den Neujahr fällt.
Die Grundregel lautet, daß eine Woche demjenigen Jahr zugeordnet wird, in dem die Mehrzahl seiner Tage liegt (also mindestens 4).

Wochentag von Neujahr Beginndatum Kalenderwoche 01
---------------------- ----------------------------
Montag 01. Januar
Dienstag 31. Dezember
Mittwoch 30. Dezember
Donnerstag 29. Dezember
Freitag 04. Januar
Samstag 03. Januar
Sonntag 02. Januar

Aus dieser Regel ergibt sich auch, daß der 4. Januar der einzige
Tag ist, der immer in der 1. Kalenderwoche liegt.

Die letzte Kalenderwoche eines Jahres beginnt spätestens am 28.12.,da eine später beginnende Woche bereits zum nächsten Jahr gerechnet wird.
Die Grundregel lautet, daß eine Woche zu dem Jahr zählt, in dem der überwiegende Teil ihrer Tage liegt (also mindestens 4 Tage).

Wochentag des 28.12 Endedatum Kalenderwoche
---------------------- ----------------------------
Montag 03. Januar
Dienstag 02. Januar
Mittwoch 01. Januar
Donnerstag 31. Dezember
Freitag 30. Dezember
Samstag 29. Dezember
Sonntag 28. Dezember

Damit man weiß ob ein Jahr nun 52 oder doch 53 Wochen umfasst, muss man nur zum beginn der ersten Woche 364 Tage addieren. Liegt dieses Datum nach dem 28.12., dann ist es bereits die erste Woche des Folgejahres und das aktuelle Jahr hat nur 52 Wochen

Einheitliche Wochentagsberechnung nach Babwani's Algorithmus:
Quelle: http://www.geocities.com/sohaelbabwani/algorithm.html

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
DHE

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Datumsfunktion mit schlechter Performance

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Ich würde mir eine interne Tabelle definieren, die die Importing-Parameter des Funktionsbausteines MC_PERIODE_ZUM_DATUM als Schlüsselfelder hat und das Ergebnis EPERID in dieser Tabelle speichern.
Vor Aufruf des Bausteines in der internen Tabelle prüfen, ob's das schon mal gab.
Wenn ja das Ergebnis aus der internen Tabelle nehmen.
Wenn nein, dann Baustein aufrufen und neuen Eintrag in interne Tabelle aufnehmen.

Folgende Benutzer bedankten sich beim Autor Dele für den Beitrag:
DHE


Re: Datumsfunktion mit schlechter Performance

Beitrag von DHE (ForumUser / 10 / 4 / 0 ) »
Danke für die Antworten.
@a-dead-trousers: interessante Idee, damit könnte man die Badi-Aufrufe eliminieren, aber es bleibt die Frage, wodurch der eigene Code schneller wird als der Standard-Code.

@Dele: das klingt gut. Sofern der READ auf die interne Tabelle schneller ist als die bisherigen Aufrufe/Berechnungen könnte das einen Vorteil bringen.

Ich werde zunächst den Aufruf von MC_PERIODE_ZUM_DATUM kapseln, um dann in dem Unterprogramm mit den verschiedenen Vorschlägen experimentieren zu können.
Grüße,
Dominic

Re: Datumsfunktion mit schlechter Performance

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Hallo Dominic,

nimm Deles Vorschlag, denn der Geschwindigkeitsgewinn, den du durch Pufferung gewinnst ist erheblich.
Wenn a-d-t seine Routine inzwischen perfektioniert hat und er sie dir zuschickt könntest du auch beide Vorschläge kombinieren ( adts Routine zum Berechnen und dann trotzdem puffern ) - aber so wie ich SAP kenne funktioniert deren Methode auch auf den Osterinseln und auf dem Mars, wo evtl. andere Gesetzmäßigkeiten gelten als hier.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DHE

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Datumsfunktion mit schlechter Performance

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Ich würde auch die Pufferung empfehlen ;)
Meine Routine zielt auf möglichst wenig Code, weil alles anhand von Formeln berechnet wird. Ist aber dadurch auch nicht so flexibel einsetzbar wie die SAP Standardfunktion.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Datumsfunktion mit schlechter Performance

Beitrag von DHE (ForumUser / 10 / 4 / 0 ) »
Ok, so mach ich es. Die Flexibilität würde ich mir schon gern erhalten wollen.
Grüße,
Dominic

Re: Datumsfunktion mit schlechter Performance

Beitrag von Tron (Top Expert / 1327 / 35 / 331 ) »
Moin.
Vielleicht sagt Dir Dieses Vorgehen zu.
http://apentia-forum.de/viewtopic.php?f ... 710#p76938
Meine Frage: gibt es einen performanteren Weg oder die Möglichkeit die Daten zwischenzuspeichern, so dass ich hier Zeit sparen kann?
Funktionsbausteine/Programme mit "Statics" / "CLASS-DATA" statt "Data" um zwischen Aufrufen die performanceträchtigen Werte zwischen zu speichern.
siehe auch http://help.sap.com/saphelp_470/helpdat ... ontent.htm


lg Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Datumsfunktion mit schlechter Performance

Beitrag von DHE (ForumUser / 10 / 4 / 0 ) »
Hallo zusammen,

ich wollte mich mit dem Ergebnis zurückmelden. Folgende Vorgehensweise habe ich gewählt: statt des Funktionsbausteins MC_PERIODE_ZUM_DATUM rufe ich das Unterprogramm PERIODE_ZUM_DATUM auf, welches die gleiche Schnittstelle hat. Darin wird für das Periodenkennzeichen 'W' der originale FuBa aufgerufen und das Ergebnis in einer internen Tabelle gepuffert. Diese wird immer zuerst gelesen, um den Aufruf des Bausteins einzusparen sooft es geht.

Die Tabelle ist sortiert und der Zugriff erfolgt mit BINARY SEARCH. Davon erhoffe ich mir zusätzliche Performance.

Für die Periodenkennzeichen 'M' und 'T' spare ich mir sowohl den Aufruf als auch die Pufferung, weil die "Berechnung" hier trivial ist. die Zeilen habe ich einfach aus dem Baustein kopiert.

Anbei die interessante Stelle:

Code: Alles auswählen.

CASE pv_perkz.

* Month and Day are copied from MC_... because easy "calculation"
      WHEN 'M'.
        pv_perid = pv_date(6).

      WHEN 'T'.
        pv_perid(4)   = pv_date(4).
        pv_perid+4(2) = pv_date+4(2).
        pv_perid+6(2) = pv_date+6(2).

      WHEN OTHERS.
* buffer requests for performance

        READ TABLE gt_period_buffer ASSIGNING <fs_period_buffer> WITH KEY perkz = pv_perkz
                                                                          datum = pv_date
                                                                          periv = pv_periv
                                                                 BINARY SEARCH.
        IF sy-subrc = 0.

          pv_perid = <fs_period_buffer>-perid.

          pv_subrc = sy-subrc.

        ELSE.

          CALL FUNCTION 'MC_PERIODE_ZUM_DATUM'
            EXPORTING
              idate        = pv_date
              iperkz       = pv_perkz
              iperiv       = pv_periv
            IMPORTING
              eperid       = pv_perid
            EXCEPTIONS
              wrong_period = 1
              OTHERS       = 2.

          pv_subrc = sy-subrc.

          IF sy-subrc = 0.

            gs_period_buffer-datum = pv_date.
            gs_period_buffer-perkz = pv_perkz.
            gs_period_buffer-periv = pv_periv.
            gs_period_buffer-perid = pv_perid.

            INSERT gs_period_buffer INTO TABLE gt_period_buffer. "sorted table

          ENDIF.

        ENDIF.

    ENDCASE.
Habe dann einen Trace gemacht mit 5'000 Materialien, weil das die SAT noch ganz gut verarbeiten kann. In der Regel wird das Programm aber mit mehr Materialien aufgerufen. Hier konnte ich eine Performance-Verbesserung um 30% feststellen, was die Gesamtlaufzeit betrifft. In meinen Augen ein hervorragendes Ergebnis.

Danke für eure Hilfe! Für Anmerkungen bin ich offen :)
Grüße,
Dominic

Re: Datumsfunktion mit schlechter Performance

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
BINARY SEARCH und SORTED TABLE? Wie geht das? Soweit ich weiß ergibt die Kombination einen Syntax-Error.
Leider hast du die Definition von GT_PERIOD_BUFFER nicht mit angegeben sondern nur als Kommentar, aber entweder fehlt nach dem INSERT ein SORT BY oder das BINARY SEARCH ist unnötig (falsch?).

lg ADT

EDIT: Ach ja, im Fehlerfall (sy-subrc ne 0) wird kein Eintrag in der Puffertabelle erzeugt und somit werden diese Fehler ständig (vermutlich auch mit demselben Ergebnis) abgefragt. Das könnte man also auch noch puffern.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
DHE

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Datumsfunktion mit schlechter Performance

Beitrag von DHE (ForumUser / 10 / 4 / 0 ) »
Es gibt keinen Syntax-Error, weil in der Hilfe steht, dass BINARY SEARCH bei sortierten Tabellen keine Wirkung hat, da diese immer binär durchsucht werden. Danke für den Hinweis, dann lass ich den Zusatz weg. Hab wohl 2x das gleiche gedacht.

Das INSERT fügt automatisch an der richtigen Stelle ein, da die Tabelle im DDIC als sortiert gekennzeichnet ist, siehe Screenshot im Anhang inkl. Definition. Somit entfällt das SORT BY.

Pufferung im Fehlerfall hab ich auch geändert, also ohne sy-subrc Abfrage. Das war auch ein guter Hinweis, danke!
Grüße,
Dominic

Seite 1 von 1

Vergleichbare Themen

3
Antw.
4571
Views
Datumsfunktion
von Gynix1 » 28.09.2006 10:50 • Verfasst in ABAP® für Anfänger
2
Antw.
1759
Views
SQL und Performance
von Hagbard » 24.11.2005 08:51 • Verfasst in ABAP® für Anfänger
3
Antw.
1903
Views
Performance
von schick » 29.03.2018 14:48 • Verfasst in ABAP® für Anfänger
3
Antw.
2399
Views
Performance
von SAP_ENTWICKLER » 19.02.2018 07:06 • Verfasst in SAP HANA für Anfänger
9
Antw.
10666
Views
Performance-Tip
von Steff » 04.09.2004 13:47 • Verfasst in Tips + Tricks & FAQs

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 2 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 2 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 254

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 2 Tagen von Lucyalison 1 / 64
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 107
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 140