Schleife zu langsam

Hallo,
Wenn Sie allerdings die Append-Methode benutzten wird der aktuelle String bearbeitet.
Stimmt nicht. Strings sind unter .NET konstant. D.h. der String einer RichTextBox wird ebenfalls neu erstellt (mit dem hinzugefügten Teil) und zugewiesen. Lediglich das Hantieren mit der Text-Eigenschaft und der Verkettung mittels + fällt weg. An der Verarbeitung der Strings ändert sich dadurch allerdings nichts.

Deswegen auch immer StringBuilder bei Textverkettungen benutzen.
Das ist so nicht richtig. Der StringBuilder zahlt sich erst ab ca. 5-7 Verkettungen aus ... also nicht _immer_ verwenden. Im obigen Fall würde es natürlich sinnvoll sein.

@Darkas: Könnte es sein, dass das SuspendLayout funktioniert, wenn du Content.Text += "my new text" verwendest und sobald du AppendText verwendest, funktioniert es nicht mehr? Wenn dem so ist, dann liegt es daran, dass anscheinend das SuspendLayout nicht an die Basisklasse weitergegeben wird (was mich zwar wundern würde, aber sicherlich vorkommen kann).
 
Hallo,

Stimmt nicht. Strings sind unter .NET konstant. D.h. der String einer RichTextBox wird ebenfalls neu erstellt (mit dem hinzugefügten Teil) und zugewiesen. Lediglich das Hantieren mit der Text-Eigenschaft und der Verkettung mittels + fällt weg. An der Verarbeitung der Strings ändert sich dadurch allerdings nichts.


Das ist so nicht richtig. Der StringBuilder zahlt sich erst ab ca. 5-7 Verkettungen aus ... also nicht _immer_ verwenden. Im obigen Fall würde es natürlich sinnvoll sein.

Das stimmt allerdings. Der StringBuilder reserviert einen Bereich im Speicher, dieser wird dann als Puffer benutzt.
Bei einer 'einfachen' + verkettung muss immer Speicher zugeordnet werden, bei einem StringBuilder geschieht dies nur, wenn der besagte Puffer zu klein ist.
Das erklärt diesen 'Leistungsschub'.

Gruß ikays.
 
Dass es gar nicht funktioniert ist mal sicher falsch. Was allerdings richtig ist ist, dass es nicht die gewünschte Performance-Steigerung bringt.

So, hier ein kleiner Test für dich, wo du dir abgucken kannst, wie du einfach und schnell zukünftig austesten kannst, was welche Geschwindigkeitssteigerung bringt:

3 Methoden, die im Prinzip unterschiedliche Dinge tun, allerdings alle gleich oft (um es schöner zu gestalten, könnte die Anzahl der Durchläufe hier mitgegeben werden).
C#:
private void FillupLogBoxText(RichTextBox rtb)
{
    rtb.Clear();
    for (int i = 0; i < 1000; i++)
        rtb.Text += "test" + System.Environment.NewLine;
}

private void FillupLogBoxAppend(RichTextBox rtb)
{
    rtb.Clear();
    for (int i = 0; i < 1000; i++)
    {
        rtb.AppendText("test" + System.Environment.NewLine);
    }
}

private void FillupLogBoxTextSuspend(RichTextBox rtb)
{
    rtb.SuspendLayout();
    rtb.Clear();
    for (int i = 0; i < 1000; i++)
    {
        rtb.Text += "test" + System.Environment.NewLine;
    }
    rtb.ResumeLayout();
}
Und hier nun die Steuerung und Ausgabe:
C#:
Stopwatch sw = new Stopwatch();

sw.Start();
FillupLogBoxText(this.LogRichTextBox);
sw.Stop();
Console.WriteLine("FillupLogBoxText: " + sw.ElapsedMilliseconds);

sw.Reset();

sw.Start();
FillupLogBoxAppend(this.LogRichTextBox);
sw.Stop();

Console.WriteLine("FillupLogBoxAppend:" + sw.ElapsedMilliseconds);

sw.Reset();

sw.Start();
FillupLogBoxTextSuspend(this.LogRichTextBox);
sw.Stop();

Console.WriteLine("FillupLogBoxTextSuspend:" + sw.ElapsedMilliseconds);
Und schon erhältst du ein Ergebnis, welches dir Aufschluss darauf gibt, welche Variante prinzipiell die bessere ist.

Und hier Ergebnisse auf einem Testrechner (Angaben in Millisekunden):
Code:
FillupLogBoxText: 2535
FillupLogBoxAppend:581
FillupLogBoxTextSuspend:2411
Viel Spass.
 
Zurück