Performance-Problem

Getting started ... Alles für einen gelungenen Start.
71 Beiträge • Vorherige Seite 3 von 5 (current) Nächste
71 Beiträge Vorherige Seite 3 von 5 (current) Nächste

Re: Performance-Problem

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
DeathAndPain hat geschrieben: Es ist kein absolut zwingender Zusammenhang, aber in den allermeisten Fällen ist der kürzere Code auch der besser lesbare.
*Ohne System, daher evtl. nicht ganz syntaxfehlerfrei - aber so geht es etwa:
<gs_output>-ovflag = cond #( WHEN line_exists( gt_bestandliste_temp[ best_idx + 1 ] ) THEN cond #( WHEN gt_bestandliste_temp[ best_idx + 1 ]-planr <> <gs_bestandsliste>-planr THEN 'X' ELSE <gs_output>-ovflag ) ELSE <gs_output>-ovflag ).
Nur ein Befehl/[lange] Zeile - aber wirklich besser lesbar?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

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


Re: Performance-Problem

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Das hängt davon ab, wie man es niederschreibt. Du kannst auch einen kompletten SELECT mit INTO, FROM, JOIN und WHERE in eine Zeile schreiben; das sieht dann auch scheußlich aus, obgleich der SELECT als solcher durchaus sachgerecht sein kann. Ähnliches gilt z.B. auch für Aufrufe von Funktionsbausteinen mit ihren ganzen Parametern. Komplexere Befehle muss man halt über mehrere Zeilen verteilen, damit sie lesbar sind.

Ich würde Deinen Code so schreiben:

Bild

Dann finde ich das durchaus gut lesbar - allerdings ist das dann nicht mehr eine Zeile lang und hat in meinen Augen keine Vorteile mehr gegenüber meiner Version (weswegen ich es auch nicht so vorgeschlagen habe).

Was ich nicht weiß, ist, was der Pretty Printer daraus machen würde, da ich diesen bei mir so eingestellt habe, dass er nur auf Großschreibung umsetzt (3.1i-Style 8)) und ansonsten die Finger von dem Code lässt. Wenn der Pretty Printer einem hier die Optik ruinieren sollte, dann stelle ich mich hinter Daniel und sage, von dem sollte man die Finger lassen. Vielleicht ist der Pretty Printer aber auch so pfiffig programmiert, dass er hier eine vielleicht etwas andere, aber dennoch lesbare Variante wählt. Alles in eine Zeile ist IMHO bei keinem COND oder SWITCH angemessen. Wenn der Pretty Printer das machen sollte, wäre es ein Versagen auf seiner Seite.
cuncon hat geschrieben:Zu dem Problem, warum war mein Programm hängen geblieben. Ich habe herausgefunden, dass FUBA SAPGUI_PROGRESS_INDICATOR zu oft aufgerufen wurde. Es gibt bei dem Code 2 LOOPS und nach jedem LOOP habe ich SAPGUI_PROGRESS_INDICATOR eingebaut und es hat Probleme gemacht. Dann habe ich bei der 2.LOOP nur je 1000.Schleife ein mal FUBA SAPGUI_PROGRESS_INDICATOR aufgerufen. Dann ging es.
Ich habe mir schon vor langer Zeit den folgenden Include gebaut:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*&  Include           ZINDIKAT
*&---------------------------------------------------------------------*
* Benutzungshinweise: Die Variablen I, AI und GES müssen als TYPE I definiert sein. Vor einem aufwendigeren LOOP über
* eine interne Tabelle xyz schreibt man dann folgende Zeilen (natürlich ohne Kommentarzeichen):

* DESCRIBE TABLE xyz LINES GES.
* CLEAR AI.

* Dann kann man im LOOP als ersten Befehl einfach

* PROGRESS_INDICATOR 'Berechnung findet statt'

* schreiben und bekommt dadurch eine Statusanzeige mit sauber hochzählender Prozentzahl.
* Die Einschränkung auf 5-Prozent-Schritte dient zur Performanceverbesserung, damit LOOPS über 1000 oder mehr
* Tabellenzeilen nicht tausendmal mit dem Client GUI kommunizieren. Ansonsten leidet nämlich die Performance merklich.

DEFINE PROGRESS_INDICATOR.
  I = 100 * SY-TABIX / GES - 5.
  IF I = 0. I = 1. ENDIF. " gleich beim ersten Durchlauf Uhr anzeigen
  IF I > AI.
    ADD 5 TO I. " nur alle 5 Prozent GUI-Sanduhr aktualisieren
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING PERCENTAGE = I
                TEXT = &1.
    MOVE I TO AI.
  ENDIF.
END-OF-DEFINITION.
Dieser Include kommt bei mir in jeden Code rein, der einen Progress Indicator mit hochzählender Uhr braucht. So kriege ich den komfortabel und mit wenigen Handgriffen in jedes Programm rein. In meinen Augen eine gut vertretbare Anwendung eines Makros.

Re: Performance-Problem

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
DeathAndPain hat geschrieben:

Code: Alles auswählen.

DESCRIBE TABLE xyz LINES GES.
Warum nicht

Code: Alles auswählen.

ges = lines( xyz ).
Sieht aus wie jede andere Zuweisung.....


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Performance-Problem

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
DeathAndPain hat geschrieben:

Code: Alles auswählen.

* DESCRIBE TABLE xyz LINES GES.
* CLEAR AI.
...
DEFINE PROGRESS_INDICATOR.
  I = 100 * SY-TABIX / GES - 5.
  IF I = 0. I = 1. ENDIF. " gleich beim ersten Durchlauf Uhr anzeigen
  IF I > AI.
    ADD 5 TO I. " nur alle 5 Prozent GUI-Sanduhr aktualisieren
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING PERCENTAGE = I
                TEXT = &1.
    MOVE I TO AI.
  ENDIF.
END-OF-DEFINITION.
Das Coding passt nicht zum Kommentar "gleich beim 1. Durchlauf Uhr anzeigen":
Beispiel: 1. Durchlauf, Tabelle hat 100 Zeilen
I = 100 * sy-tabix / GES - 5 = 100 * 1 / 100 - 5 = -4
--> IF I > AI ist nicht wahr --> es wird kein Progressindikator aufgerufen
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Performance-Problem

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
ralf hat geschrieben:Warum nicht

Code: Alles auswählen
ges = lines( xyz ).

Sieht aus wie jede andere Zuweisung.....
Weißt Du, wie alt dieser Include ist? ;-) Der hat so schon unter 3.1i funktioniert. Damals gab es Deine Syntax noch nicht. Heute würde ich ihn etwas anders schreiben, ja.
black_adept hat geschrieben:Das Coding passt nicht zum Kommentar "gleich beim 1. Durchlauf Uhr anzeigen"
Hast recht, ist ein Bug, der aber all die Jahre nicht wirklich aufgefallen ist. Vielleicht eine gute Gelegenheit, das Coding mal zu moderniseren.

Der Kommentartext war aber anders gemeint; daran erinnere ich mich (aus welchen Gründen auch immer) noch. Und zwar wollte ich verhindern, dass der FB bei hinreichend großen Tabellen anfangs mit PERCENTAGE = 0 aufgerufen wird. Dann zeigt er nämlich gar keine Uhr an, sondern nur den Text! Und dass ist natürlich blöd, wenn er mit demselben Text im weiteren Verlauf dann hochzählt. Das hat also nichts mit Deinem (berechtigten) Einwand zu tun, dass anfangs der FB gar nicht erst aufgerufen wird.

Re: Performance-Problem

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Ich habe das Coding jetzt überarbeitet. Hier ist der neue Code:

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*&  Include           ZINDIKAT
*&---------------------------------------------------------------------*
* Benutzungshinweise: Die Variablen I, AI und GES müssen als TYPE I definiert sein. Vor einem aufwendigeren LOOP über
* eine interne Tabelle xyz schreibt man dann folgende Zeilen (natürlich ohne Kommentarzeichen):

* GES = LINES( xyz ).
* CLEAR AI.

* Dann kann man im LOOP als ersten Befehl einfach

* PROGRESS_INDICATOR 'Berechnung findet statt'

* schreiben und bekommt dadurch eine Statusanzeige mit sauber hochzählender Prozentzahl.
* Die Einschränkung auf 5-Prozent-Schritte dient zur Performanceverbesserung, damit LOOPs über 1000 oder mehr
* Tabellenzeilen nicht tausendmal mit dem Client GUI kommunizieren. Ansonsten leidet nämlich die Performance merklich.

DEFINE PROGRESS_INDICATOR.
  I = TRUNC( 99 * SY-TABIX / GES ) + 1.
  IF I > AI.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING PERCENTAGE = I
                TEXT = &1.
    AI = I + 4. " 5%-Schritte machen
  ENDIF.
END-OF-DEFINITION.

Re: Performance-Problem

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
D&P: Jetzt ist das Coding zwar überarbeitet - aber man sieht, dass du es auf die Schnelle gemacht hast. Was rausgekommen ist, ist ein typisches Beispiel für unleserliches Coding.

Code: Alles auswählen.

 I = TRUNC( 99 * SY-TABIX / GES ) + 1.
Du willst eine Prozentzahl ermitteln. Da kann man doch nicht mit 99 multiplizieren und nachher noch +1 rechnen, damit komische Symptome dann korrigiert werden. Die Prozentzahl die du haben willst ist immer! 100 * sy-tabix / GES. Alles andere an der Formel ( TRUNC, 99, +1 ) ist Flickschusterei und wer das warten soll kratzt sich am Kopf was du da Seltsames fabriziert. Der Teil den du jetzt weggelassen hast um die Sanduhr auch bei 0% anzuzeigen war viel aussagekräftiger.

Code: Alles auswählen.

AI = I + 4. " 5%-Schritte machen
Gewissermaßen macht das tatsächlich 5% Schritte - aber nur nachdem man sich durch das Coding gequält hat und die ganze >-Zeichenarie auswertet . Egal was du hier machst - wenn du 5%-Schritte haben willst dann verwende eine 5 ( und dann halt >= an den richtigen Stellen ).
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Performance-Problem

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Ich fände eine Methode auch besser als ein Makro..... Kann man auch zentral warten und ich bin kein besonderer Freund von Makros. Ab in eine Serviceklasse damit als statische Methode und gut is.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Performance-Problem

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
ralf.wenzel hat geschrieben:Ich fände eine Methode auch besser als ein Makro..... Kann man auch zentral warten und ich bin kein besonderer Freund von Makros. Ab in eine Serviceklasse damit als statische Methode und gut is.
Gut gebrüllt, Löwe. Aber statt hier so was zu postulieren würde mich für diesen ganz speziellen Fall doch mal interessieren, wie so eine Serviceklasse aussehen soll, die sowohl handhabbar als auch laufzeittechnisch mit D&Ps Include mithalten kann, wenn dieser denn mal sauber ausprogrammiert gepostet würde ( also auch mit der Datendefinition für GES, AI und I bzw. sinnvoll benannten Pendants im Include ). Denn so einfach wie du das hier darstellst ist das m.E. gar nicht.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Performance-Problem

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Also, zunächst mal habe ich keine Veranlassung, anzunehmen, dass eine statische Methode grundsätzlich inperformanter ist als ein Makro. Was ich weiß, ist: Ein Makro kann man nicht debuggen und subjektiv schwerer lesbar ist es auch noch (und das geht nicht nur mir so). Eigentlich konnte mir noch niemand erklären, welchen Vorteil ein Makro hat.

Aber ich bin ja lernfähig....

Ralf

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

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Performance-Problem

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
ralf.wenzel hat geschrieben:Eigentlich konnte mir noch niemand erklären, welchen Vorteil ein Makro hat.
(Ganz) früher hab ich die verwendet um wiederkehrende Code-Abschnitte, die mit Feld-Symbolen in Methoden arbeiten zu "parametrisieren". Inzwischen gibt es ja Gottseidank den Zusatz REFERENCE INTO zu diversen Befehlen und somit auch eine OO-konforme Alternative zu den Feld-Symbolen die über Methodengrenzen hinweg funktioniert. Ich hätte damals zwar auch GET REFERENCE verwenden können, aber erst seit REFERENCE INTO hab ich die Sinnhaftigkeit dahinter verstanden. (Brett vorm Kopf usw.)
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: Performance-Problem

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Kannst du das mal bitte etwas konkreter ausführen? Dein Posting verstehe ich nicht.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Performance-Problem

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
ralf.wenzel hat geschrieben:Also, zunächst mal habe ich keine Veranlassung, anzunehmen, dass eine statische Methode grundsätzlich inperformanter ist als ein Makro. Was ich weiß, ist: Ein Makro kann man nicht debuggen und subjektiv schwerer lesbar ist es auch noch (und das geht nicht nur mir so). Eigentlich konnte mir noch niemand erklären, welchen Vorteil ein Makro hat.

Aber ich bin ja lernfähig....

Ralf
Du drückst dich vor einer Antwort. Poste doch bitte mal ein Coding welches das macht was D&P gepostet hat als statische Methode. Und danach den Aufruf ebendieser. Wahrscheinlich merkst du schon beim Versuch so eine Methode zu erstellen was der Vorteil des Makros in diesem ganz speziellen Fall ist.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Performance-Problem

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Ich drücke mich nicht vor der Antwort, ich habe die Frage gestellt (die, welchen Vorteil ein Makro hat). Bei uns ist der FB in einer Methode verschalt, die Dialog-Kollegen nutzen diese Methode, ich nicht. Weil ich eher „unter der Haube“ programmiere (ich schreibe eher Testverfahren zur automatischen Validierung). Meine Dialoge sind so klein, dass ich keine Anzeige brauche.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Performance-Problem

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
ralf.wenzel hat geschrieben:Ich drücke mich nicht vor der Antwort, ich habe die Frage gestellt (die, welchen Vorteil ein Makro hat).
Dann ist die Antwort einfach für diesen Fall: Weil der Aufruf schlanker ist als beim Aufruf einer alternativen statischen Methode[ und wahrscheinlich sogar unwesentlich performanter ].
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

14
Antw.
2924
Views
Performance Problem
von ChrissixD » 26.09.2017 09:13 • Verfasst in ABAP® für Anfänger
2
Antw.
1238
Views
Performance Problem
von ChrissixD » 21.11.2017 07:49 • Verfasst in ABAP® für Anfänger
18
Antw.
6936
Views
Performance-Problem bei SELECT
von Charadin » 22.10.2007 08:10 • Verfasst in ABAP® Core
8
Antw.
4556
Views
Speicher & Performance Problem bei XML einlesen
von Zubasa » 15.06.2011 13:48 • Verfasst in ABAP® für Anfänger
5
Antw.
3381
Views
Performance-Problem bei Aufruf einer SAP-Klasse
von xforce » 12.07.2018 13:19 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 23 / 3711
User Exit EXIT_RQCPRM10_001
vor 13 Stunden von a-dead-trousers 2 / 278
Trennen Strasse und Hausnummer
vor 19 Stunden von payten 13 / 10627
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1332

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

Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 23 / 3711
User Exit EXIT_RQCPRM10_001
vor 13 Stunden von a-dead-trousers 2 / 278
Trennen Strasse und Hausnummer
vor 19 Stunden von payten 13 / 10627
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1332

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2866
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9460