C # + = (plus equals) (Zuweisung durch Addition) arbeitet sehr langsam, wenn String zu lang ist?

7

Ich habe eine for-Schleife und was ich mache ist das.

%Vor%

Code dauert wirklich lange in dieser Forloop, vielleicht mehr als 1 Minute. Wie kann ich dieses Problem lösen?

Danke.

    
stckvrflw 17.11.2009, 11:20
quelle

5 Antworten

45

Verwenden Sie einen StringBuilder .

%Vor%

Wenn Sie += für Zeichenfolgen verwenden, erstellen Sie weiterhin neue Zeichenfolgen und suchen nach immer größeren Speicherblöcken. Deshalb ist die Operation so langsam.

    
Kobi 17.11.2009, 11:22
quelle
14

Verwenden Sie StringBuilder als @ Kobi referenziert Sie können die Leistung noch steigern, indem Sie sie initialisieren. Es scheint, dass Sie die endgültige Größe von string im Voraus bestimmen können.

%Vor%     
bruno conde 17.11.2009 11:34
quelle
2

String-Manipulationen sind unveränderlich. Es wird eine neue Zeichenkette jedes Mal erstellt werden, die stmt x + = 2000_char_long_string; wird ausgeführt. Daher sollten Sie, wie von Kobi vorgeschlagen, eine StringBuilder-Klasse verwenden.

In Ihrem Fall sollten Sie jedoch die Kapazität im StringBuilder-Konstruktor angeben.

Dies liegt daran, dass die Standardkapazität von StringBuilder bei der Erstellung 16 ist, wenn sie nicht angegeben wird.

Sobald diese Kapazität erschöpft ist, wird ein neuer zusammenhängender Speicherort erstellt, der gesamte Inhalt des StringBuilders an den neuen Speicherort kopiert und die Instanz auf den neuen Speicherort ausgerichtet. Da Ihnen die ungefähre Größe der letzten Zeichenfolge bereits bekannt ist (vielleicht 7000 * 2000), können Sie die Kapazität entsprechend angeben.

Bitte lesen Sie meine Antwort zu StringBuilder und Kapazität? für weitere Details.

    
Rashmi Pandit 17.11.2009 11:36
quelle
1

Sie sollten die StringBuilder Klasse

verwenden     
Rafael Mueller 17.11.2009 11:23
quelle
1

C # string-Objekt ist unveränderlich, jedes Mal, wenn der Inhalt geändert wird, wird ein neues Objekt erstellt und der neue Inhalt wird kopiert. Verwenden Sie stattdessen StringBuilder, um das Problem zu beheben, dem Sie gegenüberstehen

    
Prashant 17.11.2009 11:27
quelle