Forum:PTC Creo Elements/Programmierung
Thema:Problem beim ermitteln der Funktions-Dauer
Möchten Sie sich registrieren?
Wer darf antworten? Registrierte Benutzer können Beiträge verfassen.
Hinweise zur Registrierung Sie müssen registriert sein, um Beiträge oder Antworten auf Beiträge schreiben zu können.
Ihr Benutzername:
Ihr Kennwort:   Kennwort vergessen?
Anhang:    Datei(en) anhängen  <?>   Anhänge verwalten  <?>
Grafik für den Beitrag:                                                
                                                       
Ihre Antwort:

Fachbegriff
URL
Email
Fett
Kursiv
Durchgestr.
Liste
*
Bild
Zitat
Code

*HTML ist AUS
*UBB-Code ist AN
Smilies Legende
Netiquette

10 20 40

Optionen Smilies in diesem Beitrag deaktivieren.
Signatur anfügen: die Sie bei den Voreinstellungen angegeben haben.

Wenn Sie bereits registriert sind, aber Ihr Kennwort vergessen haben, klicken Sie bitte hier.

Bitte drücken Sie nicht mehrfach auf "Antwort speichern".

*Ist HTML- und/oder UBB-Code aktiviert, dann können Sie HTML und/oder UBB Code in Ihrem Beitrag verwenden.

T H E M A     A N S E H E N
AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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

clausb

Beiträge: 2894 / 0

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.

Wow, da hat jemand aber gezaubert :-D Bin beeindruckt.

Ohne genauer reinzuschauen, wäre mein erster Verdacht eher in Richtung Package-Problem. Aber wie gesagt, das ist nur die erste Kniescheibenreflexreaktion und kann daher ganz falsch sein.

Bevor ich mich in den Code vertiefe, zunächst als einleitende Frage: Ich nehme an, das Zeitmessungsmakro (time) von Common Lisp (siehe http://www.lispworks.com/documentation/HyperSpec/Body/m_time.htm) ist in Deinem Fall nicht ausreichend?

Code:

(defun testfn()
(dotimes (i 1000) (print "foo")))

(time (testfn))

"foo"
"foo"
...
"foo"
real time : 1.000 secs
run time : 0.062 secs


------------------
CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog

[Diese Nachricht wurde von clausb am 04. Mrz. 2016 editiert.]

clausb

Beiträge: 2894 / 0

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.

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.]

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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

clausb

Beiträge: 2894 / 0

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.

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

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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

clausb

Beiträge: 2894 / 0

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.

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

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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.]

clausb

Beiträge: 2894 / 0

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.

Glückwunsch!

Und hier ist die Rohfassung meines Ansatzes:

http://www.clausbrod.de/Blog/DefinePrivatePublic20160308LispProfiler

Meine Variante ersetzt die eval/defun-Akrobatik durch eine Lambda-Closure. Ausserdem kann sie Zeiten akkumulieren. Ich werde in den nächsten Tagen noch ein paar Sachen aufhübschen, aber ich glaube, auch mit dieser sehr einfachen Variante kann man schon einiges anfangen. Bin gespannt auf Testresultate, versteht sich ;-)

------------------
CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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

clausb

Beiträge: 2894 / 0

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.

Argl, da war ich schlampig. Du solltest dem Link jetzt folgen können.

------------------
CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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.]

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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

clausb

Beiträge: 2894 / 0

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.

So viel Elan ;-)

Danke fürs Lob. Ich habe noch ein paar Änderungen in der Mache. Ich hatte vor, am Wochenende ein github-Projekt aufzusetzen, was dann auch die gemeinsame Arbeit erleichtern würde.

Claus

------------------
CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog

clausb

Beiträge: 2894 / 0

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.

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.]

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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

clausb

Beiträge: 2894 / 0

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.

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

AlexG

Beiträge: 126 / 0

Win7 64-bit; Intel Core i7, 8CPUs @ 2,2GHz; 16GB RAM; 120GB SSD; Nvidia Quadro 1000 M; SolidDesigner 18.0

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.]

clausb

Beiträge: 2894 / 0

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.

Nun hat es doch ein paar Tage länger gedauert.

Auf den eigentlichen Profiler-Code aufgesetzt gibt es nun einen einfachen Dialog. Den bitte ich von der Bedienung her nur als ersten Anlauf zu bewerten.

Den Code kann man sich abholen unter https://github.com/clausb/lisp-profiler . Dort gibt es auch die aktuelle Dokumentation.

------------------
CoCreate Modeling FAQ: http://www.clausbrod.de/CoCreateModeling/ - Blog: http://www.clausbrod.de/Blog