| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für PTC CREO |
| |
| Traumwerkzeuge für die Traumfabrik , ein Anwenderbericht
|
Autor
|
Thema: Problem beim ermitteln der Funktions-Dauer (3098 / mal gelesen)
|
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 04. Mrz. 2016 11:18 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, vielleicht für den einen oder anderen eine recht triviale Geschichte, aber ich beiße mir gerade die Zähne dran aus. Zum Hintergrund: Da ich hin und wieder (und zunehmend öfters) die Dauer von Funktionen ermittle (man will ja auch, dass sein Code einigermaßen zügig arbeitet) und ich das immer wieder in meinen eigenen Code mache, habe ich mir gedacht es wäre doch nett, wenn man alle Funktionen und deren Dauer ermitteln könnte ohne das man dieses in seine Funktionen reinhängt. Als Basis diente übrigens dieser Blogeintrag: http://www.clausbrod.de/cgi-bin/view.pl/CoCreateModeling/MacroSymbolFunction Mein Intention war folgende: Ich schreibe eine Funktion welcher ich als Parameter eine Funktion übergebe, diese generiert dann wiederum eine neue Funktion welche die verstrichene Zeit berechnet während die ursprüngliche Funktion aufruft wird und ersetze dann mittels setf und symbol-function die ursprüngliche Funktion. Soweit so gut. Dieses Funktioniert auch. Bei den OSD eigenen Funktionsaufrufen (z.B. sd-inq-curr-part) funktioniert es wie erwartet. Handelt es sich jedoch um eine selbst geschriebene Funktion steigt es mit der folgenden Fehlermeldung aus: Code: The function LAMBDA-BLOCK is undefined.
Gibt es hier einen unterschied zwischen compilierten und interpretiertem Code oder habe ich mich hier mit den Packages verhaspelt? Bin für jeden Hinweis dankbar. Besten Dank und freundlichen Grüßen, Alex P.S.: Anbei der vereinfachte Code für ein verregnetes Wochenende. ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 04. Mrz. 2016 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
|
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 06. Mrz. 2016 21:39 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
Es hat dann am Wochenende doch nicht mehr zur kompletten Analyse gereicht. Ich konnte aber zumindest inzwischen die beschriebene Fehlermeldung nachvollziehen. Ich frage mich aber doch, ob Du nicht mit dem Standardmakro (time) einfacher und besser bedient wärest. Falls (time) aus irgendeinem Grund nicht passen sollte, kannst Du auch ein eigenes Zeitmessmakro schreiben. Hier das Grundgerüst für solch ein Makro: Code: (defmacro function-duration(body) `(let ((start-time (f2::seconds-since-1970))) (unwind-protect (progn ,body) (format t "~%Execution time: ~,3F~%" (- (f2::seconds-since-1970) start-time)))))
Beispiel für die Benutzung:
Code:
(function-duration (test-func 42))
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog
[Diese Nachricht wurde von clausb am 06. Mrz. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 07. Mrz. 2016 12:47 <-- editieren / zitieren --> Unities abgeben:
Die Funktion time war mir bis Dato nicht bekannt. Dafür spricht auch das Konstrukt " (let ((start-time (f2::seconds-since-1970))) ... ", richtig erkannt. Heute Abend werde ich Guy L. Steele Jr. CLTL noch einmal aus dem Keller holen und nicht nur Querlesen - versprochen. Der eigentliche Gedanke war mich in bereits geladene Funktionen zu hängen - ohne das Coding anzupacken bzw. zu "überladen" - um z.B. im laufenden/produktiven Betrieb nach zu vollziehen was wie lange dauert. Da ist die Funktion time nur mehr eine hilfreiche Vereinfachung bzw. Ergänzung. Ich vermute langsam, dass symbol-function zwischen interpretiertem und compiliertem Code Unterscheidet bzw. diese unterschiedlich behandelt. Sollte ich zu neuen Erkenntnissen kommen, werde ich mich an dieser Stelle noch mal melden. BTW: Ich sehe gerade: Aktuell 42 Beiträge und ich habe immer noch keine Antwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest bekommen. ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 07. Mrz. 2016 13:24 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
Zitat: Original erstellt von AlexG: Der eigentliche Gedanke war mich in bereits geladene Funktionen zu hängen - ohne das Coding anzupacken bzw. zu "überladen"
Also schwebt Dir mehr sowas wie ein Profiler vor? Zitat: Ich vermute langsam, dass symbol-function zwischen interpretiertem und compiliertem Code Unterscheidet bzw. diese unterschiedlich behandelt.
Bei meinen Tests funktionierte symbol-function übrigens auch für "interpretierten" Code.
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 07. Mrz. 2016 16:17 <-- editieren / zitieren --> Unities abgeben:
Also wenn ich die Wikipedia richtig verstanden habe ist ein Profiler genau, dass was ich versuche zu bauen. Ein Profiler - interessant, so nennt sich das also. Der Ursprung meines Verdachts rührt aus folgendem verhalten:
Code: (oli:Display (functionp (symbol-function 'oli:sd-inq-curr-part))) => T (oli:Display (type-of (symbol-function 'oli:sd-inq-curr-part))) => COMPILED-FUNCTION (oli:Display (symbol-function 'oli:sd-inq-curr-part)) => #<compiled-function SD-INQ-CURR-PART>(oli:Display (functionp (symbol-function 'test-func))) => T (oli:Display (type-of (symbol-function 'test-func))) => CONS (oli:Display (symbol-function 'test-func)) => (LAMBDA-BLOCK TEST-FUNC (CNT) Just another function to test. (DOTIMES (I CNT) (FORMAT T ~%~a I)))
Die compilierte Funktion wird als compiled function und der interpretierte Code, wird (warum auch immer) als Symbol vom Typen cons deklariert. Da ich jetzt aber das Schlagwort "Profiler" zur Hand habe, kann ich noch etwas exakter Recherchieren. ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 07. Mrz. 2016 23:09 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
Klar - die Darstellung einer kompilierten Funktion unterscheidet sich von einer interpretierten, und daher sieht das, was symbol-function liefert, jeweils etwas anders aus. Aber in beiden Fällen kann man das, was (symbol-function) liefert, hinterher mit (funcall) oder (apply) rufen. Das habe ich heute Abend gründlich durchgetestet. Ich denke, ich habe inzwischen eine passende Lösung, brauche aber noch einen Feierabend, bis ich sie veröffentlichungsreif habe. Dienstag/Mittwoch dann mehr zu dem Thema. Claus
------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 08. Mrz. 2016 09:31 <-- editieren / zitieren --> Unities abgeben:
W w ... bin gespannt wie ein Flitzebogen. Aber irgendwie hat es mir dann doch keine Ruhe gelassen... Und nun funktioniert es. Wie könnte es auch anders sein, war es ein reines Quotingproblem. Nachdem ich über Portable Metric-Implementierungen in Lisp gestolpert bin musste ich jedoch festellen, dass mein Quoting noch harmlos ist. Anstatt:
Code: (apply ,(symbol-function func) args)
Sollte der Code wie folgt aussehen:
Code: (apply ',(symbol-function func) args)
So jetzt reibe ich mir die Hände und überlege, was man denn damit alles so schönes machen kann. Nachdem ich das Stichwort Profiler/Profiling hatte und ein wenig recherchiert habe sind noch eine Menge Ideen dazu gekommen. Aber ich bin trotzdem noch sehr gespannt wie deine Lösung aussieht. Gruß Alex ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler [Diese Nachricht wurde von AlexG am 08. Mrz. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 08. Mrz. 2016 22:54 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
|
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 09. Mrz. 2016 07:13 <-- editieren / zitieren --> Unities abgeben:
Irgendwas scheint in deinem Blog nicht ganz sauber zu laufen. Der Link funktioniert leider nicht. Weder als TwikiGast noch als angemeldeter Benutzer. Und beim Navigieren durch den Blog erhalte ich für den Monat März folgende Meldung. Code: TOC: No TOC in "Blog.DefinePrivatePublic201603" % INCLUDE{DefinePrivatePublic20151102ChangeDirectoryDuringStartup} % Previous month: Click here.
Das machst Du doch bestimmt nur um die Spannung weiter oben zu halten... ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 09. Mrz. 2016 08:40 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
|
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 09. Mrz. 2016 12:15 <-- editieren / zitieren --> Unities abgeben:
Was soll ich sagen? Profi ist bleibt eben Profi! Sehr elegant. Dagegen wirkt mein Konstrukt einfach nur plump. Es kommt auch ganz ohne (verwirrendes) Quoting und ohne I-Kit Aufrufe (abgesehen von den letzten drei ignorierbaren Zeilen) aus, was den Code portabel macht. Erste Tests laufen und wie könnte es anders sein, funktioniert es tadellos. Ein- und Aushängen, ob mit oder ohne Parameter, ob interpretiert oder Compilat. Darstellung der Zeiten, auch aufaddiert. Top. Aber auch hier finden sich einige Funktionen wieder mit denen ich bis heute noch nie gearbeitet... Viel lernen ich noch muss. Direkt eine erste Frage: Was soll denn an diesem Code noch "aufgehübscht" werden? Und gleich die zweite hinterher: Geht das denn überhaupt? Besten Dank für die hilfreiche Unterstützung. Gruß Alex Nachtrag: Ich hatte es überlesen. Natürlich ist die Funktion f2:seconds-since-1970 nicht implementations unabhängig. ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler [Diese Nachricht wurde von AlexG am 10. Mrz. 2016 editiert.] [Diese Nachricht wurde von AlexG am 10. Mrz. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 11. Mrz. 2016 08:37 <-- editieren / zitieren --> Unities abgeben:
Ergänzend habe ich nun noch einige Werte aus memory-usage mit einfließen lassen. Im nächsten Schritt werde ich noch etwas GUI stricken und die Ausgabe noch in eine Datei umleiten. Zusätzlich ist es eine wunderbare Basis um pre-/post apply events auf alle möglichen Funktionsaufrufe zu erstellen. Sobald ich Zeit finde werde ich diese Punkte auch noch umsetzen und bereitstellen. Gruß Alex ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 11. Mrz. 2016 09:58 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
|
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 12. Mrz. 2016 21:44 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
Moinmoin, wie angekündigt, ist das Projekt jetzt auf Github veröffentlicht: https://github.com/clausb/lisp-profiler Nach aussen ist die wichtigste Neuerung wahrscheinlich das Makro with-profiler, mit dem sich die Anwendung erheblich vereinfacht: Code:
(profiler.clausbrod.de:with-profiler ('function-to-be-profiled) (run-some-performance-test))
Oder man lässt neben der Testfunktion gleich noch alle Funktionen in einem Package messen: Code:
(profiler.clausbrod.de:with-profiler ('function-to-be-profiled (find-package "MY-PACKAGE")) (run-some-performance-test))
Beiträge sind natürlich sehr willkommen - deswegen ja auch die Veröffentlichung per Github. Im Moment ändert sich allerdings noch recht viel. Ich schätze, dass so etwa in einer Woche mehr Stabilität einzieht und sich dann erstmals halbwegs sinnvoll auf den Code aufsetzen lässt, was eigene Änderungen angeht. Bescheid ;-) ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog
[Diese Nachricht wurde von clausb am 12. Mrz. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 12. Mrz. 2016 22:05 <-- editieren / zitieren --> Unities abgeben:
Nabend, ich hoffe es blieb trotzdem noch genügend Zeit ein wenig das schöne Wochendwetter zu genießen. Habe gerade nur kurz einen Blick drauf geworfen, da meine Nase, wie bereits angedroht in CLtL steckt... wenn ich mir deinen Code so anschau bestätigt sich der Verdacht, dass ich noch SEHR viel zu lernen habe. Sobald ich dazu komme werde ich es weiter testen. Bin gespannt wohin die Reise noch geht. Wünsch noch ein entspanntes Restwochenende. Gruß Alex ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 14. Mrz. 2016 10:10 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
Zitat: Original erstellt von AlexG: Zusätzlich ist es eine wunderbare Basis um pre-/post apply events auf alle möglichen Funktionsaufrufe zu erstellen.
Wenn ich mich recht entsinne, kann man bei den KCL-Abkömmlingen (dazu gehört auch die Lisp-Implementierung in CoCreate Modeling) das (trace)-Makro mit :entry- und :exit-Forms versorgen. Weiss gerade nicht mehr auswendig, wie das geht, aber wenn das noch funktioniert, wäre es eine ganz simple Basis für das, was Du "pre/post apply events" nennst. Dazu bräuchte man dann nicht unbedingt eine eigene Profiler-Infrastruktur. ------------------ CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AlexG Mitglied
Beiträge: 133 Registriert: 05.04.2013 CP/M; 6510@0,985249 MHz; 64KB RAM; 20KB ROM; MOS 6569
|
erstellt am: 14. Mrz. 2016 22:21 <-- editieren / zitieren --> Unities abgeben:
Im KCL Report habe ich erst einmal nichts überraschend neues über den Tracer finden können. Wenn man sich die Funktionalität in AKCL anschaut, kann einem Angst und Bange werden... was es da alles noch für Möglichkeiten gibt (:DECLARATIONS, :COND, :ENTRYCOND,...). Aber das mit dem "Feuern der Events" ist Off Topic, ein Nebenkriegsschauplatz, und lässt sich wie gerade gelernt, relativ einfach umsetzen. Wieder ein dickes Dankeschön für den tollen Tipp. Die Funktionalitäten provide und requiere find ich sehr aufschlussreich - nun verstehe ich endlich welche "Magie" hinter dem Laden der (SolidDesigner) Goodies steckt. Auch wenn sich gerade das eine oder andere Geheimnis für mich gelüftet hat, habe ich immer mehr das Gefühl am Eingang des Kaninchenbaus zu stehen. Ich habe gerade eben noch einmal getestet. Auf anderer Hardware und dabei kam mir direkt die Frage in den Sinn: Welcher Rechnenknecht läuft denn "Flotter". Für die Auswertung der GPU-Performance gibt es doch, richtig: viewbench. Aber für die "CPU-Performance" (ich nenne es einfach mal so, da spielt natürlich noch mehr Hardware mit) gibt es meines wissen nach noch keinen standardisierten Test. Ein Framework für solch einen Test ist ja mittlerweile durchaus gegeben. Fehlt noch eine vereinheitlichte Reihenfolge von (Test-)Funktionsaufrufen... und das ein oder andere, was ich sonst vergessen habe. Wenn die Zeit es zulässt, werde ich mir darüber auch noch einmal Gedanken machen. ------------------ Computer sind unbrauchbar. Sie können nur Fragen beantworten. Pablo Picasso, Maler [Diese Nachricht wurde von AlexG am 15. Mrz. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
clausb Ehrenmitglied V.I.P. h.c.
Beiträge: 2914 Registriert: 20.12.2000 Ich schreibe das hier in meiner Freizeit und spreche weder für meinen Arbeitgeber noch für andere Firmen. Mehr Unsinn von mir unter clausbrod.de.
|
erstellt am: 19. Mrz. 2016 19:57 <-- editieren / zitieren --> Unities abgeben: Nur für AlexG
|