Ja, aber das waren meistens Auswertungen mit vielen Daten die in den Speicher geladen werden.black_adept hat geschrieben:@Dele: Tuning ist immer gut und Kleinvieh macht aus Mist. Und wenn dann ein signifikanter Geschwindkeitszuwachs von 15% wie bei dir erreicht wird ist das nie zu verachten obwohl ich schätze, dass ihr diesen Aufwand nie betrieben hättet, wenn die Transaktion nur 10x am Tag aufgerufen worden wäre.
Aber nichtsdestotrotz möchte ich meine ursprüngliche Frage an adt auch an dich weitergeben. Hast du jemals erlebt, dass das Umstellen von Workarea/Kopfzeile auf Feldsymbol tatsächlich irgend etwas laufzeittechnisch Relevantes gebracht hätte?
Aber es gilt auch: je schneller die Rechner werden, desto geringer werden die Performance-Unterschiede. Dann fallen die "ganz langsamen" Programme erst wieder auf, wenn der Rechner an seine Grenzen kommt.- Lesender Zugriff: Feldsymbole bringen erst etwas, wenn mehr als 5.000 Byte bewegt werden.
- Ändernder Zugriff: Feldsymbole lohnen sich immer
Grundsätzlich: je größer die betroffenen Datenmengen, desto lohnender ist der Einsatz kopierfreier Techniken
Genau auf den Vergleich mit den Workareas habe ich mich auch bezogen, denn die sind ja die propagierte Alternative zu den Kopfzeilen. Man hat die Kopfzeilen ja nicht wegen der Performance deprecated.Sorry, aber vorallem den letzten Satz kann ich so nicht unkommentiert stehen lassen:
Beim Arbeiten mit Kopfzeilen, werden die Inhalte von der Tabelle in die Kopzeile KOPIERT. Genau gleich wie bei einer WORKAREA (Feldleiste).
DELE:Interne Tabellen über Feldsymbole zu manipulieren ist performant, mir aber dennoch unsymphatisch, weil man dabei sehr leicht aus dem Auge verlieren kann, wann, wo und warum Tabelleninhalte plötzlich mutieren. Im Quellcode ist es ein Segen, wenn man durch die 3000 Zeilen einfach nach dem Namen der internen Tabelle suchen kann und damit alle Stellen ausgeworfen bekommt, an denen damit etwas veranstaltet wird, wobei diejenigen, bei denen der Inhalt verändert wird, durch ein INSERT oder MODIFY explizit gekennzeichnet werden. Das macht das Verständnis und die Analyse insbesondere fremden Codes bedeutend einfacher - und wird von Feldsymbolen wirksam torpediert.
Datenreferenzen sind sowieso der effizienteste Weg sicherzustellen, dass kein anderer Programmierer nachvollziehen kann, was Dein Code da macht.
5,11 Stunden klingt viel. Aber 230.000 Dialogschritte... wie viele User müssen das sein, um so viele Dialogschritte am Tag sinnvoll abwickeln zu können? Ich gehe davon aus, dass wir da von einer Organisationsgröße reden, bei der diese 5,11 Stunden absolute Peanuts sind. Sowas muss man immer im Verhältnis sehen. Ich hätte gerne im Monat 10.000 € mehr im Portemonnaie, aber wenn BMW im Monat 10.000 € einsparen würde, dann wäre das nicht mal einen Nebensatz wert.Wir haben vor ein paar Monaten eine Eigenentwicklung getunt. Vorherige durchschnittliche Antwortzeit 510 Millisekunden, was ja eigentlich schon sehr gut ist. Danach 430 Millisekunden. Das hat kein Anwender bemerkt. Aber: die Anwendung hat pro Tag ca.230.000 Dialogschritte.
Ersparnis: ca. 18.400.000 Millisekunden = 18.400 Sekunden = 306 Minuten = 5,11 Stunden
Auch das halte ich in den allermeisten Fällen für grundfalsch. Dazu müsste nämlich der Anteil des ABAP-Interpreters an der Rechenzeit überhaupt nennenswert sein! Wo kommen denn die Antwortzeiten her, wenn ein Anwender auf "Sichern" klickt (oder sonst einen Schritt macht)? Zum allergrößten Teil von Datenbankanfragen. Heutzutage, da die SAP-Server meist nicht mehr im eigenen Haus stehen, kommen noch Leitungslatenzen als zweiter, durchaus gravierender Faktor hinzu (verschärft von in den Leitungen sitzenden Firmenfirewalls mit ihrer Deep Packet Inspection). Der Anteil des ABAP-Interpreters an der Gesamtantwortzeit ist minimal. Je nach Anwendung wird der irgendwo im einstelligen Prozentbereich liegen. Und wenn man jetzt seine internen Tabellenzugriffe (die ja selbst wiederum nur einen Teil der Interpreter-Rechenzeit ausmachen, sagen wir mal 50%) auf Feldsymbole umstellt, dann hat man von den 5% Interpreterrechenzeit einen Anteil von 2,5% optimiert. Der Optimierungserfolg beträgt, sagen wir, 30%. Also sind diese 2,5% der Gesamtantwortzeit des Systems um 30% besser geworden und machen jetzt nur noch 1,7% der Gesamtantwortzeit des Systems aus.Naja, die gibt es schon, allerdings sind das dann Programme, bei denen die Tabelle via Feldsymbol geändert wird. Da ist der Vorteil gegenüber einer Feldleiste und MODIFY erheblich.
Aber garantiert nicht dadurch, dass ihr den LOOP AT INTO durch einen LOOP AT ASSIGNING ersetzt habt. Ich behaupte, wenn ihr nur das gemacht hättet, wäre das Ergebnis nicht wahrnehmbar gewesen. Das hättet ihr unter Ulk verbuchen können.Die Standardapplikation hat hier je nach Datenmenge schon mal gemütliche 50% der Laufzeit "vertrödelt" indem es die Quellstrukturen mittels LOOP AT INTO analysiert hat. Nachdem wir eine eigene Funktion dafür gebaut haben (die zugegebenermaßen nun auch mehr Möglichkeiten bietet) wurde dieser Wert auf 5% maximal(!) gedrückt.
Das Mantra ist richtig, hat aber eine Dimension, die Du anscheinend nicht im Auge hast: Die Wartbarkeit des Codes. Jeder Schritt hin zu einem schlechter nachvollziehbaren Code kostet einen Preis, der nichts mit Performance zu tun hat, gleichwohl jedoch ganz erheblich ist. Für einen Performancegewinn, der so lächerlich ist wie Feldsymbol statt Workarea nebst MODIFY, in Kauf zu nehmen, dass ein anderer Entwickler, der den Code vielleicht mal warten muss, nicht mehr mit wenigen Handgriffen nachvollziehen kann, wo der Inhalt dieser internen Tabelle genutzt wird und wo er insbesondere verändert wird, ist nicht zu rechtfertigen. Ein einziger Bug, der einem durch solch unnötig erhöhte Komplexität reinrutscht, kann ganz locker mehr kosten als alles, was diese Minimalstoptimierung in 20 Jahren an gesparter Arbeitszeit einbringen würde!Beim Thema Performance bin ich der gleichen Meinnung wie Dele: Denke global, handle lokal.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
user2008
DeathAndPain hat geschrieben:Interne Tabellen über Feldsymbole zu manipulieren ist performant, mir aber dennoch unsymphatisch, weil man dabei sehr leicht aus dem Auge verlieren kann, wann, wo und warum Tabelleninhalte plötzlich mutieren. Im Quellcode ist es ein Segen, wenn man durch die 3000 Zeilen einfach nach dem Namen der internen Tabelle suchen kann und damit alle Stellen ausgeworfen bekommt, an denen damit etwas veranstaltet wird, wobei diejenigen, bei denen der Inhalt verändert wird, durch ein INSERT oder MODIFY explizit gekennzeichnet werden. Das macht das Verständnis und die Analyse insbesondere fremden Codes bedeutend einfacher - und wird von Feldsymbolen wirksam torpediert.
Ich glaube schön langsam verstehe ich dein Problem:DeathAndPain hat geschrieben:Das Mantra ist richtig, hat aber eine Dimension, die Du anscheinend nicht im Auge hast: Die Wartbarkeit des Codes. Jeder Schritt hin zu einem schlechter nachvollziehbaren Code kostet einen Preis, der nichts mit Performance zu tun hat, gleichwohl jedoch ganz erheblich ist. Für einen Performancegewinn, der so lächerlich ist wie Feldsymbol statt Workarea nebst MODIFY, in Kauf zu nehmen, dass ein anderer Entwickler, der den Code vielleicht mal warten muss, nicht mehr mit wenigen Handgriffen nachvollziehen kann, wo der Inhalt dieser internen Tabelle genutzt wird und wo er insbesondere verändert wird, ist nicht zu rechtfertigen. Ein einziger Bug, der einem durch solch unnötig erhöhte Komplexität reinrutscht, kann ganz locker mehr kosten als alles, was diese Minimalstoptimierung in 20 Jahren an gesparter Arbeitszeit einbringen würde!a-dead-trousers hat geschrieben:Beim Thema Performance bin ich der gleichen Meinnung wie Dele: Denke global, handle lokal.
Da liegst Du deutlich falsch, ebenso wie mit Deiner Annahme, das dies in "Legacy Code" nicht üblich sei. "Strukturierte Programmierung", die ja landläufig als Vorgänger von OO gilt, hat nicht ohne Grund diesen Namen. Ob Du eine FORM oder eine Methode machst ist nebensächlich. In beiden Fällen strukturierst Du Dein Programm. Und glaub mir, das mache ich seit jeher, und ich behaupte, in deutlich überdurchschnittlicher Qualität (insbesondere was die Dokumentation meiner Unterroutinen angeht).Ich glaube schön langsam verstehe ich dein Problem:
Du hast nicht gelernt deine Programme in kleine Happen aufzuteilen.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
user2008
???DeathAndPain hat geschrieben:[...] Bei Forms ist es zugegebenermaßen nicht viel anders. Aber aufgrund der schwächeren Kapselung und besser lesbaren (da nicht über den ganzen Code verstreuten) Definition kann man sich bei Forms die Funktionalität besser selber herleiten.[...]
Du meinst vielleicht das Richtige - aber so ist das falsch. Die Prüfung findet schon statt - aber erst zur Laufzeit weil ABAP nicht zwischen dynamischen und statischen Funktionsaufrufen unterscheidet.ralf.wenzel hat geschrieben:Dass eine Methodendefinition Teil der Klassendefinition ist, ist richtig (im Sinne von "gewollt"). Nur deshalb prüft z. B. die Syntaxprüfung die Typen der Parameter. In Funktionsbaustein-Aufrufen findet diese Prüfung nicht statt, aus genau diesem Grund.
Was für ein elitärer und selbstbeweihräuchernder Humbug - ein neuer Höhepunkt deiner Postings, Ralf.ralf.wenzel hat geschrieben:Zum Verständnis bzgl. Debuggen: OO ist eine "Abstraktionsschicht", die Vieles ermöglicht, was ohne sie nicht umsetzbar wäre. Das bedeutet aber auch, dass Menschen, die damit umgehen, ein gewisses Abstraktionsvermögen besitzen und etwas mehr können, als Kommandos hintereinander zu schreiben. Und dass man sich eben mit dieser Abstraktion auch beschäftigt. Man kann eben nicht mehr so einfach drauflos debuggen nach dem Motto "ich sehe ja, was passiert".
Wie Daniel es hier mal schrieb: Ein wichtiger Vorteil von ABAP ist, dass es sich liest wie englische Prosa, so dass es jeder Idiot verstehen kann. Um es nochmal deutlich zu sagen: Die Zeiten sind vorbei!! Das war ein Vorteil für den Kleinkram, den man zu ABAP-Anfangszeiten schrieb. Aber jetzt, wo komplexe Anwendungen in ABAP entstehen (und das ist ja schon eine Weile so), kommt man damit nicht weiter, wenn man das noch wartbar betreiben will.
Ich bin gerade an der Entwicklung einer hoch komplexen Anwendung beteiligt, die intensiv diese Abstraktionsmechanismen nutzt und ich bin dankbar dafür, viele kleine Einheiten zu haben, die in sich selbstständig funktionieren und die miteinander über definierte Schnittstellen kommunizieren.
Ja, die "F5 im Debugger"-Fraktion muss sich weit recken, um das zu verstehen...
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 3):
Unit605 • DeathAndPain • Murdock
Das tue ich auch, nachdem mir die SAP mit Release 7.40 meinen geliebten Backend-Editor final abgekniffen hat (ja, ich weiß, aber wenn man die ganzen geisteskranken Hotkeys verinnerlicht hat, kann man damit irrsinnig schnell arbeiten und schlägt locker die Mausmarkier-Frontendfraktion). Da ich mich also ohnehin umgewöhnen musste, habe ich gesagt, ok, dann mache ich gleich den großen Schritt und setze direkt auf den allerneuesten Sch.... Habe es auch nicht bereut. Eclipse ist cool, wenn man sich dran gewöhnt hat.Es steht dir frei, Eclipse oder den Quelltext-Editor mit Splitscreen zu nutzen
Und bei privaten Methoden ist das anders? Die wenigsten Unterroutinen in einem strukturiert aufgebauten Programm sollen von außen ansprechbar sein. Soweit dies gewünscht ist, nimmt man bei klassischem Code Funktionsbausteine.FORMs sind schon deshalb doof, weil man sie nicht von außen ansprechen kann (bzw. soll).
Soweit die Theorie. Die funktioniert auch hervorragend, wenn Du das Programm selber geschrieben hast, denn dann kennst Du alle Ideen und Konzepte und kennst genau das Sollverhalten all Deiner Objekte und Methoden.Zum Verständnis bzgl. Debuggen: OO ist eine "Abstraktionsschicht", die Vieles ermöglicht, was ohne sie nicht umsetzbar wäre. Das bedeutet aber auch, dass Menschen, die damit umgehen, ein gewisses Abstraktionsvermögen besitzen und etwas mehr können, als Kommandos hintereinander zu schreiben. Und dass man sich eben mit dieser Abstraktion auch beschäftigt.
Dann mach Dir doch mal den Spaß und versetze Dich in die Situation eines externen Beraters (oder Deines Nachfolgers, nachdem Du die Firma verlassen hast). Tausch die Aufgaben mit einem Deiner Kollegen, so dass Du vor den von Dir genannten vielen kleinen Einheiten stehst, freilich seinen und nicht Deinen eigenen, und rausfinden darfst, wofür sie stehen und was ihr genaues bestimmungsgemäßes Sollverhalten ist (erforderlich, um zwischen Bug und Feature unterscheiden zu können und generell zu verstehen, wie das Programm arbeitet). Dabei darfst Du ihn nicht fragen und Dich nicht an etwaiger Papier- oder Dateidoku bedienen, sondern musst am Quellcode bleiben.Ich bin gerade an der Entwicklung einer hoch komplexen Anwendung beteiligt, die intensiv diese Abstraktionsmechanismen nutzt und ich bin dankbar dafür, viele kleine Einheiten zu haben, die in sich selbstständig funktionieren und die miteinander über definierte Schnittstellen kommunizieren.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
user2008 • Unit605
In der Praxis läuft es aber in aller Regel anders.Natürlich hängt die Qualität einer Entwicklung auch an ihrer Dokumentation. Darum ist - eben aufgrund der höheren Abtraktionsebene - die Doku auch besonders wichtig und sollte nicht einfach weggelassen werden. Sie ist Bestandteil des Codings und ich würde keinen Berater wegschicken, ohne dass er sein Coding gescheit dokumentiert hat.
Gut dokumentieren war schon zu allen Zeiten ratsam und angesagt. Die Tatsache, dass man bei herkömmlichem Code ohne Doku noch eine Chance hat und bei OO nicht, soll jetzt ein Vorteil von OO sein?!? Das finde ich doch eine sehr verquere Logik.Der Vorteil dabei ist: Es fordert zum Dokumentieren auf, man darf den Ruf halt nicht überhören.
Die kommt ja vielleicht noch. Der Self-Updater von Eclipse findet ja alle paar Tage was Neues. Wobei kürzlich (im Rahmen einer neuen Version) allerdings nicht etwas Neues gekommen, sondern etwas verschwunden ist. In der Vergangenheit konnte ich über das Menü Navigate -> Open Others direkt in die Pflege der Texte zum Programm abspringen. Dieser Menüpunkt ist jetzt in Oxygen nicht mehr da. Weiß Du zufällig, wo er geblieben ist?Leider, und das finde ich ganz, ganz übel und wurde von mir mit Horst Keller diskutiert, fehlt in Eclipse eine übersetzbare, versionierte Dokumentationsmöglichkeit am Objekt wie die SE80 sie bietet.
Da sind wir deutlich unterschiedlicher Meinung.Ich habe übrigens schon viele Fremdanwendungen gewartet, und das ist bei den 3.000-Zeilen-Monstern, in denen ein "X" vom Himmel fällt und was tut, auch nicht einfacher.