Autor Thema: Performance bei der Programmierung einsparen  (Gelesen 3349 mal)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Performance bei der Programmierung einsparen
« am: 19.11.09 - 10:30:58 »
Hallo liebe Kollegen,

Ich haber hier seit Wochen ein Projekt laufen, dass sich im finalen Stand befindet. Es funktioniert also.

Mein Problem ist nun, dass ich wohl leider zu unperformant programmiert habe.

Ich arbeite im Hauptsächlichen Fall mit

NotesDXLExporter
NotesDXLImporter
Strings
und ein paar selbst geschriebenen kleinen Klassen.

Könnt ihr mir sagen, wo so ein paar Performance Fallen lauern, damit ich meinen Code optimieren kann ?
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline Felix Ziegler

  • Aktives Mitglied
  • ***
  • Beiträge: 122
Re: Performance bei der Programmierung einsparen
« Antwort #1 am: 19.11.09 - 10:47:59 »
Hallo Robert,

ich denke dieser Link wird dir weiterhelfen können:

http://www.jamiemagee.com/jm/jamie.nsf/downloads/JMAE-7XULMY

Wobei natürlich DXLImporter/-Exporter nicht zu den schnellsten Klassen im Notes Bereich zählen ...

Viele Grüße
Felix

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Performance bei der Programmierung einsparen
« Antwort #2 am: 19.11.09 - 11:52:45 »
So habe mal das PDF überpflogen, danke schon mal aber die bösen Fehler habe ich nicht gemacht.

Ich die die exporter und die importer sind nicht schuld.

Laut Profiling ergebnis lasse ich extrem viel zeit beim GetItemValue. Leider werden meine eignen Klassen nicht mit "profilisiert"
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Performance bei der Programmierung einsparen
« Antwort #3 am: 19.11.09 - 12:16:20 »
die verdächtigen Stellen kannst du einfach mit
Code
Dim start
start = Getthreadinfo(6) ' LSI_THREAD_TICKS
.... problematic code
print "Code XXX took" , Getthreadinfo(6)  - start, "ms"
stoppen. LSI_THREAD_TICKS hat eine Auflösung von ~16ms. Falls dir das nicht reicht um die Problemstellen aufzuzeigen kannst du
Code
Declare Private Function QueryPerformanceFrequency	Lib "Kernel32" (X As Currency) As Boolean
Declare Private Function QueryPerformanceCounter		Lib "Kernel32" (X As Currency) As Boolean
verwenden. Dieser hat eine wesentlich höhere Auflösung.

Wir haben uns hierfür eine kleine Klasse (profiler) gebaut, welche im Konstruktor und Destruktor die Zeit misst und dann protokolliert wie lang das Objekt gelebt hat.
Man kann dann mit einem Einzeiler die Zeit stoppen, die man in einer Methode braucht:
Code
public function anyFunction()
  dim p as new Profiler("infotext") ' wenn die GarbageCollection das Objekt löscht, muss die Zeit ausgegeben werden.
  ... rest of code
end function

Wenn du dann deine problematischen Methoden gefunden hast, dann kannst ja mal Codeausschnitte posten.

Gruß
Roland



Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Performance bei der Programmierung einsparen
« Antwort #4 am: 19.11.09 - 12:48:27 »
Hmmm, Profiling. Schönes Thema.
Habe ich auch gerade an den Füssen, da wir hier einige Dinge haben die extrem Lange brauchen.
Einen Übeltäter habe ich schon, lässt sich wohl leider ohne weiteres nicht ändern. Eine engebettete Ansicht auf eine andere DB. Böööööse Falle... Nun gut. mal schauen, ob man das mit anderen Mitteln ändern kann.
Aber diese Profilingklasse hört sich gut an.
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Performance bei der Programmierung einsparen
« Antwort #5 am: 19.11.09 - 14:12:57 »
So. Habe das Folgende in meiner Notes.ini eingetragen

Client_Clock=1
Debug_Console=1
Debug_Outfile=<path to filename>


scheint aber nicht mehr zu funktionieren, das Debugfenster ist leider nicht sehr gesprächig. ( Notes 7.0.3 ), kann das jemand bestätigen?

Funtioniert, nur mal wieder nicht bei mir...  ::)
« Letzte Änderung: 19.11.09 - 14:57:11 von DerAndre »
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Performance bei der Programmierung einsparen
« Antwort #6 am: 19.11.09 - 15:07:25 »
*hüstel*
<path to filename>
*hüstel*
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Performance bei der Programmierung einsparen
« Antwort #7 am: 19.11.09 - 15:22:54 »
Da setht bei mir c:\temp\log.txt

Das Problem ist aber, daß das Debugfenster keinen Piep sagt...

Ganz so deppert bin ich nu auch nicht  ;D

So

Oder so

Wie gesagt, mein Client mag mal wieder nicht.
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Performance bei der Programmierung einsparen
« Antwort #8 am: 19.11.09 - 15:31:42 »
Angesehen davon, was hilft die die Info, dass der oder der Call länger braucht? Für die Anwendung wirst Du ja nicht ein neues Netzwerk, neue Server, ... bekommen, oder?

Ist dir eigentlich schon klar "WAS" an Deiner Anwendung "langsam" ist? Irgendwie kommt mir vor, als würdest Du ohne Plan herumstochern, oder?
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Performance bei der Programmierung einsparen
« Antwort #9 am: 19.11.09 - 15:34:32 »
Ich glaube mit dem Eclipse-Client geht das mit dem Debug-Window nicht mehr...

@m3
Wenn man mal die langsamen Calls gefunden hat, kann man sich ja immer noch Lösungen überlegen ob der Call notwendig ist, bzw. durch Caching von Zwischenergebnissen was verbessern kann. (Wobei ich mir NICHT vorstellen kann, das ein GetItemValue der Performance-Killer ist)

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Performance bei der Programmierung einsparen
« Antwort #10 am: 19.11.09 - 17:47:48 »
Martin, wen meinst Du?
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Performance bei der Programmierung einsparen
« Antwort #11 am: 20.11.09 - 08:27:14 »
Also ich bedanke mich erstmal für die anrengende Diskusion.

Habe das Problem mit ein paar prints relativ schnell einfangen können.

Erst hat eine Funktion die eh nicht richtig funktionierte knappe 20 Sekunden gebraucht, diese habe ich einfach gelöscht und deren funktionalität in einer anderen Funktion eingefügt, die sowieso schon alle nötige Werte im ZUgriff hat.

Dann war meine eigene Klasse noch ein Problem unter anderen bin ich mit einem DB.Search auf die Datenbank los. Als ich das schon geändert habe, konnte ich noch einiges gut machen.

Als letztes habe ich dreimal den Exporter losgetreten, weil ich die zu exportierenden Felder im einzelnd in nem neuen Dokument exportiert habe. Ich habe dann einfach das vorhandene exportiert und mir per strleft und strRight die passenden Werte gezogen, und schon braucht der Konstruktor nicht mehr 2 Sekunden sondern nur noch einen Bruchteil.

Als Krönung habe ich eine Liste mit bereits verwendeten Objekten meiner Klasse erstellt, heisst, wenn ich das Objekt nochmal brauche schaue ich einfach schnell in die Liste und habe das Dokument wieder, ohne den Konstruktor nochmal aufzurufen.
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz