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
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...
Ich muss das aber irgendie "geteilt" senden, da ich auch unterm senden z.B. die Position im File ändern muss...
Wie auch immer du es machst, solange du einzelne Zeichen aus dem Socket liest, wird es nicht schneller.
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).
Kannst du nicht vielleicht alle Daten übertragen und danach das ändern was du ändern musst?
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...
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).