Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Performance von Indy tidimap (https://www.delphipraxis.net/147042-performance-von-indy-tidimap.html)

jsheyer 31. Jan 2010 20:18


Performance von Indy tidimap
 
Hallo,

es geht darum die Mails von einem IMAP Server verwalten zu lassen, anstatt sie doppelt auch in der lokalen Datenbank abzulegen.
Dazu habe ich z. B. die TidImap Komponente (Indy 10.) benutzt. Dazu habe ich das Bespiel Mail Programm der Indy's verwendet.
Das lesen funktionert auch, aber die Geschwindigkeit ist recht langsam, für 30 Mail Header (nur die Header) benötige ich ca. 4-5 Sekunden.
Gleichzeitig habe ich mit einem die Demo Version von IP*Works installiert und siehe da, das IP*Works Demo schafft locker 700 Mails in der gleichen Zeit.
Jetzt Frage ich mich, ist Indy wirklich so viel langsamer, oder ist es einfach ein Denkfehler von mir.

Mit Indy läuft eine Schleife:
Delphi-Quellcode:
            for i := 0 to min(nCount-1,30) do begin
                TheImap.GetUID(ncount - i, TheUID);
                TheImap.UIDRetrieveFlags(TheUID, TheFlags);
                TheImap.uidRetrieveHeader(TheUID, TheMsg);
Ich habe es mit den Indy' auch nur mit einem :
Delphi-Quellcode:
                TheImap.uidRetrieveHeader(int, TheMsg);
versucht, ist etwas schneller, aber nicht viel.

Bei IP*Works gibt es eine Funktion:
Delphi-Quellcode:
ipwIMAP1.FetchMessageInfo();
Diese Funktion erspart die Schleife und im OnMessageInfo Event kann kann man die zurückgelieferten Einträge in der gewünschten Form darstellen.

Ich habe es mit Delphi 7 Architect und Delphi 2010 Enterprise getestet, das Ergebnis ist das gleiche.
Vieleicht bin ja einfach nur Betiebsbling im Moment ;-)

Gruß

Jörg

[edit=mkinzler]Delphi-Tags eingefügt Mfg, mkinzler[/edit]

jsheyer 2. Feb 2010 14:44

Re: Performance von Indy tidimap
 
Ich habe jetzt auch einen Test mit den Indy Komponenten mit der Funktion RetrieveAllHeaders gemacht, was aber leider auch keine Verbessung gebracht, was eigentlich auch logisch scheint, da wohl RetrieveAllHeaders die RetrieveHeader wiederum aufruft.


Woran kann es also liegen das IP*Works so viel schneller ist? Ich habe gesehen das es auch eine Komponente für IMAP Abfragen in der Clever Internet Suite gibt.

Habt Ihr ähnlich Erfahrung im Thema Performance zwischen Indy, IP*Works und vielleicht auch anderen Komponenten?

Gruß

Jörg

Astat 2. Feb 2010 14:53

Re: Performance von Indy tidimap
 
Zitat:

Zitat von jsheyer
Ich habe jetzt auch einen Test mit den Indy Komponenten mit der Funktion RetrieveAllHeaders gemacht, was aber leider auch keine Verbessung gebracht,

Hallo jsheyer, klingt interessant. Kannst Du mal mit einem Network Monitor beide Varianten aufzeichnen.
Dann sollte man sehen warum einer so schnell und der Andere so langsam ist.

lg. Astat

jsheyer 2. Feb 2010 16:27

Re: Performance von Indy tidimap
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also, ich habe das jetzt wie gewünscht mit einem Netzwerk Monitor mitgeschrieben, und man sieht sofort, das die Indy Komponente deutlich mehr kommuniziert, ich habe die beiden pcap Dateien von Wireshark/Ethereal einmal angehängt, ich hoffe das ist so okay.

Was die Indy Komponente betrifft war das jetzt die Version in der Schleife mit den einzelnen Retrieve Header.

Das Protokoll emthält die Daten wenn die Mails einer Mailbox (unterordner) von unserem test IMAP Server abgerufen werden, das Login ist nicht mit enthalten.

Gruß

Jörg

Assertor 2. Feb 2010 18:20

Re: Performance von Indy tidimap
 
Hallo jsheyer,

Zitat:

Zitat von jsheyer
Ich habe es mit Delphi 7 Architect und Delphi 2010 Enterprise getestet, das Ergebnis ist das gleiche.
Vieleicht bin ja einfach nur Betiebsblind im Moment ;-)

Ja, das wird es sein, denn Du vergleichst Äpfel mit Birnen :mrgreen:

Mit ipWorks & Co ziehst Du den IMAP4 ENVELOPE, also den vom IMAP-Server bereits geparsten Kurz-Header, mit Indy ziehst Du hingegen den ganzen Header. Das das länger dauert, ist normal, gewollt und liegt nicht an Indy sondern an RFC 3501 & Co. Wenn Du mit ipWorks die vollen Header ziehst, dauert es ebenfalls so lange: Willkommen in der Welt von IMAP4 ;)

Schau Dir also mal TIdIMAP4.RetrieveAllEnvelopes() an und die zugehörige TIdMessageCollection, damit kannst Du auch mit Indy nur die ENVELOPE Header ziehen.

Gruß,
Assertor

jsheyer 2. Feb 2010 21:54

Re: Performance von Indy tidimap
 
Hallo Assertor,

vielen Dank schon einmal für Deinen Hinweis, ich hatte auch schon einmal die Funktion RetrieveEnvelope versucht, die aber anscheinend auch nicht schneller war, hatte ich leider nicht gesagt.
Die RetrieveAllEnvelope werde ich jetzt als Vergleich testen, nur bei meinen ersten Versuch, kommt kein Ergebnis, hier mein Auszug aus dem Quellcode:


Delphi-Quellcode:
TheImap.SelectMailBox(MailBoxName);
AllMsg := TIdMessageCollection.Create(TIdMessageItem);
TheImap.RetrieveAllEnvelopes(Allmsg);

AllMsg.Count ergibt immer 0
TheImap.MailBox.TotalMsgs ergibt dagegen 30

Gruß

Jörg

jsheyer 2. Feb 2010 23:18

Re: Performance von Indy tidimap
 
Hallo Assertor,

so, das ganze hat mir jetzt ja keine Ruhe gelassen, interessanterweise hat RetrieveAllEnvelope keine Daten zurückgeliefert, auser auf der INBOX selber, aber jede andere Mailbox kamen keine Daten, erst nachdem ich eine kleine Modifikation in der idIMAP4.pas vorgenommen habe, mir ist aufgefallen das dort ein IMAP4Commands[cmdFetch] fehlt. Sobald ich das einfüge geht es, es betrifft übrigens beide Varianten die RetrieveAllEnvelope und die UIDRetrieveAllEnvelope

In der function TIdIMAP4.RetrieveAllEnvelopes steht:

Delphi-Quellcode:
        SendCmd (NewCmdCounter, ( IMAP4Commands[cmdFetch] + ' 1:* (' + {Do not Localize}
          IMAP4FetchDataItem[fdEnvelope] + ')'), [] ); {Do not Localize}
Ändert man es in:
Delphi-Quellcode:
        SendCmd (NewCmdCounter, ( IMAP4Commands[cmdFetch] + ' 1:* (' + {Do not Localize}
          IMAP4FetchDataItem[fdEnvelope] + ')'), [IMAP4Commands[cmdFetch]] ); {Do not Localize}

dann geht es, das gleiche mit der TIdIMAP4.UIDRetrieveAllEnvelopes

Delphi-Quellcode:
        SendCmd (NewCmdCounter, ( IMAP4Commands[cmdUID] + ' ' + IMAP4Commands[cmdFetch] + ' 1:* (' + {Do not Localize}
          IMAP4FetchDataItem[fdEnvelope] + ')'), [] ); {Do not Localize}

ändern in:
Delphi-Quellcode:
        SendCmd (NewCmdCounter, ( IMAP4Commands[cmdUID] + ' ' + IMAP4Commands[cmdFetch] + ' 1:* (' + {Do not Localize}
          IMAP4FetchDataItem[fdEnvelope] + ')'), [IMAP4Commands[cmdFetch]] ); {Do not Localize}
Soweit ich weiss sind die Entwickler der Indy Komponenten hier auch vertreten, oder??

Gruß

Jörg

Sir Rufo 2. Feb 2010 23:56

Re: Performance von Indy tidimap
 
Zitat:

Zitat von jsheyer
Soweit ich weiss sind die Entwickler der Indy Komponenten hier auch vertreten, oder??

:cyclops: Schau dem Assertor doch mal gaaaaaaanz tief in die Augen ... äh, in die Signatur :cyclops:

und ich vermute, du lässt dir die avatar-bilder der user nicht anzeigen, weil dann hätte dich bei asstertor da was angeleuchtet :mrgreen:

jsheyer 3. Feb 2010 08:17

Re: Performance von Indy tidimap
 
Ja,
stimmt Avatar anzeigen ist wohl per default ausgeschaltet, ich habs jetzt eingeschaltet, schääm :-(
Danke für den Hinweis. Dann ist diese Info bei Assertor ja schon einmal definitiv richtig :-)

Gruß

Jörg

Assertor 3. Feb 2010 08:25

Re: Performance von Indy tidimap
 
Hallo Jörg,

Zitat:

Zitat von jsheyer
so, das ganze hat mir jetzt ja keine Ruhe gelassen, interessanterweise hat RetrieveAllEnvelope keine Daten zurückgeliefert, auser auf der INBOX selber, aber jede andere Mailbox kamen keine Daten, erst nachdem ich eine kleine Modifikation in der idIMAP4.pas vorgenommen habe, mir ist aufgefallen das dort ein IMAP4Commands[cmdFetch] fehlt.

Hatte gestern keine Zeit mehr selbst einen Test damit zu machen :oops: Du hast natürlich recht, das fehlte dort. Danke fürs Reporten :thumb:

Zitat:

Zitat von jsheyer
Soweit ich weiss sind die Entwickler der Indy Komponenten hier auch vertreten, oder??

Ja, das Gerücht hält sich hartnäckig :mrgreen:

Zitat:

Zitat von jsheyer
Dann ist diese Info bei Assertor ja schon einmal definitiv richtig :-)

Absolut, wird kurzfristig ins Indy SVN eingecheckt :) Vielleicht ist das sogar schon im Quality Central / RAID gemeldet, dann kann ich das da gleich auch schließen...

Edit: Ist nun im SVN, im QC und RAID war dazu nichts offen :)

Freut mich, das es jetzt geht und die Performance nun auch stimmt :)

Gruß,
Assertor

:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz