Autor Beitrag
Hedrykk
Hält's aus hier
Beiträge: 4

WIN XP
Delphi 6
BeitragVerfasst: Fr 30.01.09 14:43 
Hallo zusammen,

gerne würde ich in kompetenter Runde ein kleines problem zum besten geben, an dem sich bei mir momentan Verzweiflung und Frustration eine reichhaltige Tafel gedeckt haben.
Ich habe ein kleines Geschwindigkeitsproblem mit einem meiner Programme. Um dies besser zu verstehen, möchte ich zunächst grob die Struktur erläutern:

Eine Thread- Instanz erstellt zur Laufzeit dynamisch und einmalig eine bestimmte Anzahl von Instanzen einer anderen Klasse. Diese Klasse wiederum erstellt dann eine Instanz einer Klasse, bei der ich jeweils einen TIdUDPServer und einen TIdUDPClient habe.
Mit diesen wird mit einer nicht Windows-Basierten Hardware (FPGA Xilinx) kommuniziert und verfügt über eine Eventsteuerung. Bedeuted, wenn ich manuell ein Datenpacket zur Hardware gesendet habe (per übergeordneten Thread getriggert) und darauf die Antwort erhalten habe, sorgt die Empfangsroutine der Komponente dafür, dass das nächste Packet automatisch gesendet wird... naja, somit also Threadlaufzeitfreies closed loop für eine 'Datenpumpe'.

Nun zum eigentlichen Problem:
Wird dynanisch nur eine Instanz erstellt, erhalte ich eine Datenübertragungsgeschwindigkeit von ca 4MByte/s für eben diese. Bei zweien ist für jede Instanz die Datenrate genau so. Ab der Dritten erhalte ich einen Einbruch auf 2,5MByte/s. Bei Vieren liege ich dann bei ca. 1,1Mbyte/s pro Instanz.

Rechnerpeformance und Netzwerkbelasung sind nicht einmal nenneswert (Quadcore). Die Anbindung erfolgt über GigaBit Ethernet mit einem eigenen Nummernkreis, bei dem physikalisch auch nichts anderes als die Zielhardware angeschlossen wird.

Ach so, Delphi 6 ist die momentane Entwicklungsumgebung.

Ich bin für jeden Tipp dankbar.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 15:54 
Woher kommen denn die Daten?

Kann es sein, dass z.B. die Festplatte durch die gleichzeitigen Zugriffe bremst (falls diese dabei eine Rolle spielt)? Und was verhindert denn bei der ersten Instanz eine höhere Geschwindigkeit als 4 MiB/s? Die Netzwerklatenz?

Bei mehreren gleichzeitigen Zugriffen können die Pakete auch nicht gleichzeitig gesendet werden sondern nur nacheinander. D.h. das bremst auch je mehr parallele Übertragungen stattfinden sollen.
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Fr 30.01.09 17:08 
welche Komponente benutzt du denn für die Übertragung und in welchen Versionen?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Hedrykk Threadstarter
Hält's aus hier
Beiträge: 4

WIN XP
Delphi 6
BeitragVerfasst: Fr 30.01.09 17:26 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Woher kommen denn die Daten?

Kann es sein, dass z.B. die Festplatte durch die gleichzeitigen Zugriffe bremst (falls diese dabei eine Rolle spielt)? Und was verhindert denn bei der ersten Instanz eine höhere Geschwindigkeit als 4 MiB/s? Die Netzwerklatenz?


Zunächst erst einmal Danke für die prompte Antwort. Also die Daten stammen aus eienm reservierten Speicher. Der Speicher wird im vorfeld mit den entsprechenden Daten gefüllt. Per Pointer hol ich mir dann die Datenmenge dann raus, die ich für meinen Frame benötige (UDP Header +1028Byte Daten) und schicke den Datensatz raus.

Die Limitierung der ersten Instanz geschieht durch die externe Hardware. Der verwendete Networkcore von Xilinx ist eventgesteuert. Bedeutet, er nimmt den entsprechenden Datensatz an, Prüft ihn, schreibt ihn in einen Pufferspeicher und sendet dann die entsprechende Antwort zum Packet mit der errechneten Checksumme.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Bei mehreren gleichzeitigen Zugriffen können die Pakete auch nicht gleichzeitig gesendet werden sondern nur nacheinander. D.h. das bremst auch je mehr parallele Übertragungen stattfinden sollen.


Das ist schon richtig, ich hätte aber erwartet, dass bei der kleinen Bandbreite (4Mbyte/s lim. durch Hardware) durchaus ohne so starke einbrüche gehandlet werden könnte. Per Hausfrauenrechnung sind bei Gigabit ja 128MByte/s drin. Großzügig geschätzt hätte ich jetzt ne reelle Bandbreite von 40-50MByte/s erwartet (rest von Protokoll-Header und sonstiges Datengut, welches Windows meint so durch die gegend schieben zu müssen). Mein gewünschter Optimalfall liegt ja lediglich bei 12-15Mbyte/s.

Zudem gibt es noch neuigkeiten! Habe mir von einem Kollegen das Projekt mit Delphi 2006 compilieren lassen. Siehe da, bei 4 Instanzen erreiche ich nun die doppelte Geschwindigkeit! Es scheint so, als wenn man weiter bei der Komponente forschen muss.
Kennt noch jemand eine schicke Komponente, bei der man in Sachen Geschwindigkeit bessere Karten hat, als bei den IndyUDPs?
Hedrykk Threadstarter
Hält's aus hier
Beiträge: 4

WIN XP
Delphi 6
BeitragVerfasst: Fr 30.01.09 17:32 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
welche Komponente benutzt du denn für die Übertragung und in welchen Versionen?


Hallo Matze,
ich nutze die Komponente TIdUDPServer und TIdUDPClient, also die Indy Produkte, die im Delphi enthalten sind. Wie gesagt, scheint dein Ansatz mit den Versionen (unterschied Delphi 6 und Delphi 2006) schon richtig zu sein. Kennst du denn eventuell ne geeignetere Komponente?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 17:47 
user profile iconHedrykk hat folgendes geschrieben Zum zitierten Posting springen:
Zudem gibt es noch neuigkeiten! Habe mir von einem Kollegen das Projekt mit Delphi 2006 compilieren lassen. Siehe da, bei 4 Instanzen erreiche ich nun die doppelte Geschwindigkeit! Es scheint so, als wenn man weiter bei der Komponente forschen muss.
Dann wirst du noch Indy 9 haben. (Und er mit Delphi 2006 Indy 10.)

Falls du keine zusätzlichen Komponenten verwendest, kannst du auch einfach Turbo Delphi kostenlos herunterladen (das ist ja Delphi 2006) und es selbst damit testen. Aber ich vermute einmal du brauchst zusätzliche Komponenten, dann geht das nicht so einfach.

Aber Indy 10 gibt es auch für Delphi 6:
www.indyproject.org/...Files/Indy10.EN.aspx

Es kann natürlich auch an Delphi selbst liegen, aber wahrscheinlicher ist die Indyversion.
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Fr 30.01.09 18:05 
es hat sich auf der Speichermanager in den neueren Versionen geändert, wodurch ich durch alleiniges Neucompilieren meiner Programme teilweise eine Steigerung feststellen konnte.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Hedrykk Threadstarter
Hält's aus hier
Beiträge: 4

WIN XP
Delphi 6
BeitragVerfasst: Fr 30.01.09 18:26 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
es hat sich auf der Speichermanager in den neueren Versionen geändert, wodurch ich durch alleiniges Neucompilieren meiner Programme teilweise eine Steigerung feststellen konnte.


Danke euch beiden. Ich denke, ich werde nächste Woche erst einmal eine neue Delphi Version bei uns auf den Weg bringen. Dann kann ich immer noch mal auf Beutezug bezüglich weitere Komponenten gehen.
Und, wie gesagt, Vorschläge in dieser Richtung werden weiterhin gerne entgegen genommen :D

... wär eigentlich schon fast nen neuen Thread wert, aber: Wenn man Jahrelang mit Delphi 6 gearbeitet hat, bis zu welcher Version ist der umstieg denn am wenigsten Gewöhnungsbedürftig?

schönes Wochenende!
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 30.01.09 18:35 
Delphi 7 (vielen werden mit zustimmen, dass das das beste Delphi war/ist). Ab Delphi 8 hat sich von der IDE geändert.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 22:48 
user profile iconHedrykk hat folgendes geschrieben Zum zitierten Posting springen:
... wär eigentlich schon fast nen neuen Thread wert, aber: Wenn man Jahrelang mit Delphi 6 gearbeitet hat, bis zu welcher Version ist der umstieg denn am wenigsten Gewöhnungsbedürftig?
Vom Umstieg her Delphi 7.

Allerdings lohnt sich die Umgewöhnung auf die neuen Versionen allemal. Ich arbeite seit ich Delphi 2006 benutze extrem viel schneller als vorher. Durch die ganzen Hilfen beim Code schreiben, Refactoring, etc. kann ich alles viel schneller schreiben, überblicken und bei neuen Versionen umstrukturieren.

Die größte Umgewöhnung war für mich auch weniger die IDE als vielmehr, dass ich Delphi jetzt offen lasse. Denn Delphi 1..7 startet ja in weniger als einer halben Sekunde praktisch sofort, während Delphi 2006 trotz SpeedUp ca. 6 Sekunden braucht, auf einem älteren PC sogar 15. Und wenn ich das dann immer wieder schließen würde, dann würde das bei vielen kleinen Projekten nerven (mich zumindest).
Ganz schlimm war da Delphi 2005, da war die IDE selbst träge, auch nach dem Start, das war nervig (auch wenn Updates das verbessert haben).

Delphi 2007 und 2009 sind beim Arbeiten sehr angenehm. Allerdings bringt 2009 Unicodeunterstützung mit, so dass du da vorher mit der Trial testen solltest, ob der Aufwand des Portierens zu groß ist. Wenn viel mit Strings gearbeitet wird, dauert das teilweise ewig, jedenfalls, wenn man es sauber macht. Vor allem machen dabei oft Fremdkomponenten Probleme, wenn es keine neuen Versionen mehr gibt.

Wenn das also kein Problem ist, kann ich Delphi 2009 empfehlen, denn es hat schon recht nette Verbesserungen. Ansonsten ist Delphi 2007 eine sehr gute Alternative. In jedem Fall rate ich dir die Trial vorher zu testen.