Laden...

Empfangsfunktion beschleunigen

Erstellt von CaptainIglo vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.612 Views
C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren
Empfangsfunktion beschleunigen

Hi,

ich habe hier eine TCP-Verbindung bei welcher ich Pakete empfange, die mit "%@%" abgeschlossen werden.
Momentan lese ich diese mit folgeder Funktion ein:

            for (i = 0; i < data.Length; i++)
            {
                byte[] tmp = new byte[1];
                client.Client.Receive(tmp, 1, SocketFlags.None);

                if (System.Text.Encoding.ASCII.GetString(tmp) == "%")
                {
                    if (j == 0 || j == 2)
                        j++;

                    if (j == 3)
                        break;
                }
                else if (System.Text.Encoding.ASCII.GetString(tmp) == "@")
                {
                    if (j == 1)
                        j++;
                }
                else
                {
                    j = 0;
                    data[i] = tmp[0];
                }
            }

Wenn ich jetzt aber ein größeres File in mehreren Paketen schicke, kommen ca. alle 25-50ms ein Paket mit ~10kB an und das Auslesen mit der Schleife dauert dann auch etwa diese 25ms und ich habe deshalb 100% CPU-Last.

Kann ich das irgendwie optimierne, das das schneller geht?

mfg
Capt.Iglo

B
1.529 Beiträge seit 2006
vor 17 Jahren

Logisch, dass es langsam ist, wenn du jedes Zeichens einzeln einliest. Desweiteren kann dein Endezeichen "%@%" doch ebenfalls in einer Datei vorkommen.
Ich würde dir empfehlen, die gesamte Sende-/Empfangsroutine (quasi dein Protokoll) noch mal zu überarbeiten.
Wieso schreibst du die Datei nicht einfach komplett in einen NetworkStream? Die Endeerkennung und Segmentierung kann doch der Treiber übernehmen...

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Ich muss das aber irgendie "geteilt" senden, da ich auch unterm senden z.B. die Position im File ändern muss...

S
8.746 Beiträge seit 2005
vor 17 Jahren

Wie auch immer du es machst, solange du einzelne Zeichen aus dem Socket liest, wird es nicht schneller.

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Das Auslesen an sich braucht nicht lange, sondern das andauernde abprüfen, ob das Endezeichen eingetroffen ist und dafür suche ich eine bessere/schnellere Lösung.

Ich bin auch für andere Vorschläge offen, ich muss nur eine Datei Übertragen können, aber die Übertragung auch "ändern" können und am Ziel schon auf die Daten zugreifen, obwohl noch nicht alle eingetroffen sind (Streaming).

M
174 Beiträge seit 2006
vor 17 Jahren

Kannst du nicht vielleicht alle Daten übertragen und danach das ändern was du ändern musst?

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Original von Muphin
Kannst du nicht vielleicht alle Daten übertragen und danach das ändern was du ändern musst?

Nein, da der User nicht 5min warten will bis alle Daten da sind, bis er mit dem Teil, was er schon hat arbeiten kann.

Aber ich probiere gerade eine alternative zu obiger Funktion...

C
CaptainIglo Themenstarter:in
366 Beiträge seit 2005
vor 17 Jahren

Habe es nun recht gut gelöst:

Sende jetzt zuerst die Größe des Packetes und lese dann das ganze Packet am Stück aus -> ich kann das Senden am Server so stark "ausbremsen" das der Client mit 10-15% CPU-Last mitkommt und die Geschwindigkeit immer noch weit ausreichend ist.
Wenn ich das Senden gar nicht ausbremse wäre die Übertragung sogar VIEL schneller als benötig (~1-2s für das ganze File), aber während dieser kurzen Zeit 100% CPU-Last. Mit dem Ausgebremsten brauche ich ca. 10-12s was immer noch sehr gut für meine Anwendung ist (bis 20-30s währe noch akzeptabel).