Ich habe den folgenden Code innerhalb einer Schleifenanweisung.
In der Schleife werden Strings an sb (StringBuilder) angehängt und geprüft, ob die Größe von sb 5 MB erreicht hat.
Dies funktioniert gut, aber es ist sehr langsam (in Bezug auf die Überprüfung der Größe)
Was wäre der schnellste Weg, dies zu tun?
Sie können die UTF-8
-Länge schnell mit
Wenn ASCII-Zeichen den Inhalt dominieren, könnte es etwas schneller sein,
zu verwenden %Vor%stattdessen.
Aber Sie können auch das Optimierungspotenzial in Betracht ziehen, indem Sie nicht die gesamte Größe neu berechnen, sondern nur die Größe des neuen Fragments, das Sie an die StringBuilder
anhängen, etwas ähnliches
Dies setzt voraus, dass wenn Sie Fragmente mit Ersatzpaaren anhängen, diese immer vollständig sind und nicht in ihre Hälften aufgeteilt werden. Für normale Anwendungen sollte dies immer der Fall sein.
Eine weitere Möglichkeit, vorgeschlagen von Didier-L , ist, die Berechnung zu verschieben, bis Ihr StringBuilder
erreicht ist eine Länge der Schwelle geteilt durch drei, wie zuvor, ist es unmöglich, eine UTF-8
-Länge größer als die Schwelle zu haben. Dies ist jedoch nur dann von Vorteil, wenn Sie in einigen Ausführungen threshold / 3
nicht erreichen.
Wenn Sie eine 1000-fache Schleife ausführen, werden Sie 1000String generieren und dann in das Array "UTF-8 Byte" konvertieren, um die Länge zu erhalten.
Ich würde die Konvertierung durch Speichern der ersten Länge reduzieren. Erhalten Sie dann in jeder Schleife nur die Länge des hinzugefügten Werts, dann ist dies nur eine Addition.
%Vor%Dies würde den belegten Speicher und die Konvertierungskosten verringern
Erwägen Sie die Verwendung eines ByteArrayOutputStream und eines OutputStreamWriter anstelle von StringBuilder. Verwenden Sie ByteArrayOutputStream.size (), um die Größe zu testen.