<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Optimierung mit Strings]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Im aktuellen Projekt wurde ein Parser umgesetzt, der aus dem Inhalt einer Datei ein Objekt erzeugt. Dabei nutze ich leider sehr viele String-Operationen. Momentan nutze ich die Klasse AnsiString von Borland und dabei auch besonders häufig '+='.</p>
<p>Nun weiß ich noch von Java, dass dort sowas durch einen StringBuffer optimiert wird, da dieser nicht immer wieder ein neues Objekt erstellt. Kann mir jemand sagen, ob es eine solche Klasse auch in C++ gibt und wie diese heißt?</p>
<p>Zudem werden viele Casts in meinem Code gemacht. Dabei wird überwiegend bei Funktionsaufrufen aus Integern AnsiStrings gemacht (automatisch im Hintergrund). Kann das ein weiterer Punkt sein, wo ich Performance unnötig verbrauche? Durch einen Umbau könnte ich auch die Werte als AnsiStrings vorhalten (den Typ des Parameters kann ich nicht anpassen).</p>
<p>Allgemein gesagt suche ich Tipps, wie ich eine möglichst hohe Performance erreiche, wenn ich viel mit Strings arbeiten muss (wobei 'viel' momentan im Bereich von z.B. 100.000 Zeilen liegt, daher könnten auch kleinere Tipps viel bringen). Ist vielleicht auch die Klasse AnsiString für solche Operationen nicht die beste?</p>
<p>Ich bin für jeden Tipp dankbar, denn momentan liegt das Einlesen, Auswerten und Exportieren einer Datei bei ca. 12min, was definitiv zu lange ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/166907/optimierung-mit-strings</link><generator>RSS for Node</generator><lastBuildDate>Thu, 13 Aug 2026 02:55:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/166907.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Dec 2006 11:50:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 11:50:54 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Im aktuellen Projekt wurde ein Parser umgesetzt, der aus dem Inhalt einer Datei ein Objekt erzeugt. Dabei nutze ich leider sehr viele String-Operationen. Momentan nutze ich die Klasse AnsiString von Borland und dabei auch besonders häufig '+='.</p>
<p>Nun weiß ich noch von Java, dass dort sowas durch einen StringBuffer optimiert wird, da dieser nicht immer wieder ein neues Objekt erstellt. Kann mir jemand sagen, ob es eine solche Klasse auch in C++ gibt und wie diese heißt?</p>
<p>Zudem werden viele Casts in meinem Code gemacht. Dabei wird überwiegend bei Funktionsaufrufen aus Integern AnsiStrings gemacht (automatisch im Hintergrund). Kann das ein weiterer Punkt sein, wo ich Performance unnötig verbrauche? Durch einen Umbau könnte ich auch die Werte als AnsiStrings vorhalten (den Typ des Parameters kann ich nicht anpassen).</p>
<p>Allgemein gesagt suche ich Tipps, wie ich eine möglichst hohe Performance erreiche, wenn ich viel mit Strings arbeiten muss (wobei 'viel' momentan im Bereich von z.B. 100.000 Zeilen liegt, daher könnten auch kleinere Tipps viel bringen). Ist vielleicht auch die Klasse AnsiString für solche Operationen nicht die beste?</p>
<p>Ich bin für jeden Tipp dankbar, denn momentan liegt das Einlesen, Auswerten und Exportieren einer Datei bei ca. 12min, was definitiv zu lange ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1186751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186751</guid><dc:creator><![CDATA[DarkGuardian]]></dc:creator><pubDate>Mon, 04 Dec 2006 11:50:54 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 11:59:23 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Du kommst mit einen <em>std::stringstream/fstream</em> sowohl vom Code-Aufbau als auch von der Geschwindigkeit besser weg.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1186759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186759</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 04 Dec 2006 11:59:23 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 12:58:11 GMT]]></title><description><![CDATA[<p>Das hängt aber von der jeweiligen STL-Implementation ab. Zumindest bei Filestream-Operationen gibt es große Unterschiede. Am schnellsten war hier der BCB6 mit STLPort. Sowohl RougeWave (BCB5) als auch Dinkumware (BDS2006) sind da deutlich langsamer.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7971">@akari</a><br />
hast du AnsiString mal mit der STL verglichen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1186812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186812</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 04 Dec 2006 12:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 13:18:02 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>@ Braunstein : Direkt nicht. Mit der Geschwindigkeit bezog ich mich darauf</p>
<blockquote>
<p>Nun weiß ich noch von Java, dass dort sowas durch einen StringBuffer optimiert wird, da dieser nicht immer wieder ein neues Objekt erstellt. Kann mir jemand sagen, ob es eine solche Klasse auch in C++ gibt und wie diese heißt?<br />
...<br />
Dabei wird überwiegend bei Funktionsaufrufen aus Integern AnsiStrings gemacht</p>
</blockquote>
<p>Ich weiß nicht genau, was IntToStr im Detail macht, aber bei</p>
<pre><code class="language-cpp">stream &lt;&lt; 10;
</code></pre>
<p>sollte die Umwandlung mit minimalem temporären Aufwand erfolgen (der dann noch von der Implementation der STL abhängen kann)</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1186836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186836</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Mon, 04 Dec 2006 13:18:02 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 14:29:08 GMT]]></title><description><![CDATA[<p>@DarkGuardian<br />
Wichtig ist hier erstmal dein normaler Code. Versuche Kopien zu vermeiden (insbesondere bei Funktionsparametern) und nutze immer wenn es geht Referenzen. Versuche die Erzeugung von temporären Strings zu vermeiden.<br />
z.Bsp.</p>
<pre><code class="language-cpp">// Hier mehrere temporäre AnsiStrings
AnsiString test = &quot;Teststring1&quot; + test2 + &quot; Nr.3&quot; + IntToStr(54);
// Hier nicht
AnsiString test(&quot;Teststring1&quot;);
test += test2;
test += &quot; Nr.3&quot;;
test += IntToStr(54);
</code></pre>
<p>Versuche vor allem rauszubekommen welcher Teil deines Programmes die meiste Zeit braucht. Wenn es das Einlesen von der Datei ist, teste verschiedene Varianten (VCL, Standard-C++, C-Funktionen, WindowsAPI).<br />
Am schnellsten, aber auch am komplexesten und fehleranfälligsten ist pures C.<br />
Zumindest beim BCB6 waren die C-Funktionen nicht viel schneller als Standard-C++. Beim BCB5 war da schon mal Faktor 10 dazwischen.<br />
Funktionen aus der WinAPI sollten bei sehr großen Dateien das meiste bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1186933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186933</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 04 Dec 2006 14:29:08 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 15:33:51 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Hier mehrere temporäre AnsiStrings
AnsiString test = &quot;Teststring1&quot; + test2 + &quot; Nr.3&quot; + IntToStr(54);
// Hier nicht
AnsiString test(&quot;Teststring1&quot;);
test += test2;
test += &quot; Nr.3&quot;;
test += IntToStr(54);
</code></pre>
</blockquote>
<p>Ich nutze eh die zweite Variante, wobei dabei aber doch trotzdem jeweils pro Zeile ein neues Objekt vom Typ AnsiString erzeugt wird. Ansich sollte aber schon im Vorfeld ein möglichst großer Speicherbereich bereitgestellt werden, der bei den Additionen gefüllt wird, damit nicht unnötig Zeit zum Erstellen neues Objekt verbraten wird.</p>
<p>Zudem scheint es wichtig zu sein, dass ich den BCB6 nutze. Ich hätte zwar nicht gedacht, dass es dabei große Unterschiede gibt, aber so wie es sich hier liest, braucht ihr die Info.</p>
<p>Ich bin leider noch nicht dazu gekommen, <em>std::stringstream</em> zu testen. Aber vom Namen und der Beschreibung her, sollte es sowas sein, wie ich es suche. Trotzdem bin ich natürlich froh über jeden weiteren Tipp bzgl. Optimierung beim Arbeiten mit Strings (welchen auch immer).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1186997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1186997</guid><dc:creator><![CDATA[DarkGuardian]]></dc:creator><pubDate>Mon, 04 Dec 2006 15:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 16:05:18 GMT]]></title><description><![CDATA[<p>DarkGuardian schrieb:</p>
<blockquote>
<p>... Ich nutze eh die zweite Variante, wobei dabei aber doch trotzdem jeweils pro Zeile ein neues Objekt vom Typ AnsiString erzeugt wird. ...</p>
</blockquote>
<p>Nicht unbedingt. Wenn erst in AnsiString umgewandelt werden muß, klar. Dies ist hier</p>
<pre><code class="language-cpp">test += test2;
</code></pre>
<p>aber nicht erforderlich.<br />
Am Wichtigsten ist es wohl erst einmal festzustellen, wo denn der Engpass ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187031</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 04 Dec 2006 16:05:18 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 16:11:50 GMT]]></title><description><![CDATA[<p>Ist es denn nicht so, dass durch ein '+=' das Objekt AnsiString mehr Speicher anfordern und ggfs den eigenen Inhalt dabei umkopieren muss? Da würde dann ja schon eine Verschwendung von Ressourcen beginnen.</p>
<p>Leider kenne ich mich mit den Interna von C++ und der Bibliotheken nicht so gut aus, aber aus Java weiß ich, dass es dort so gemacht wurde (keine Ahnung, ob das noch immer der Fall ist). Daher suche ich ja einen passenden Buffer (oder etwas Vergleichbares, um optimiert arbeiten zu können).</p>
<p>Trotzdem natürlich danke für deine Tipps. Wahrscheinlich muss ich einfach mal ausprobieren, womit ich Geschwindigkeitsvorteile erreichen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187039</guid><dc:creator><![CDATA[DarkGuardian]]></dc:creator><pubDate>Mon, 04 Dec 2006 16:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Mon, 04 Dec 2006 17:08:30 GMT]]></title><description><![CDATA[<p>Wie AnsiString das konkret handhabt weiß ich auch nicht. Intern werden ja Pascal-Funktionen aufgerufen (bei += LStrCat). Du könntest ja mal mit SetLength experimentieren. Wenn du Lust hast kannst du ja mal in die dstring.cpp sowie in die System.pas reinschauen. Da ist der Sourcecode für diese Funktionen zu finden. Ist aber viel ASM.<br />
Zuweisungen bei AnsiString verursachen übringens erstmal keine Kopien, da hier mit Referenzzählung gearbeitet wird.<br />
Theoretisch könnte der String ja grundsätzlich mehr Speicher vorhalten (so wie bei vector, deque etc.), so daß nicht so oft umkopiert werden muß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187072</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Mon, 04 Dec 2006 17:08:30 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Tue, 05 Dec 2006 09:13:36 GMT]]></title><description><![CDATA[<p>hi</p>
<p>@DarkGuardian</p>
<p>wie ist die datei die du einlesen willst aufgebaut ?<br />
und wie sieht so ein object aus ?<br />
erstellst du die datei auch selber ?<br />
oder schreibst du gerade einen konverter ?</p>
<p>kannst du da mal ein bisschen was davon zeigen ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187255</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Tue, 05 Dec 2006 09:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Tue, 05 Dec 2006 14:42:22 GMT]]></title><description><![CDATA[<p>Es handelt sich um eine Logdatei, die etwas aufgebohrt ist. Darin enthalten sind Fehler- und Hinweistexte in drei verschiedenen Sprachen sowie die Logeinträge. Leider kann ich davon hier nichts zeigen, aber beschreiben kann ich es zumindest.</p>
<p>Die Datei wird zeilenweise eingelesen, wobei zuerst die Texte genommen werden. Diese werden in unterschiedliche Kontainer geschoben (pro Sprache einen). Danach folgen die Logeinträge, die binär kodiert sind. Diese werden jeweils in kodierter Form in einer Struktur gesichert. Alle Logeinträge landen dann in einem Vector.</p>
<p>Die einzelnen Bereiche sind durch definierte Texte (zB begin_errtext) in einer Zeile markiert. Dadurch kann meine Software unterscheiden, was die aktuelle Zeile darstellt.</p>
<p>Sobald die Logdatei zur Anzeige gebracht werden soll, werden die Einträge umkodiert, damit sie lesbar in GUI dargestellt werden können.</p>
<p>Im Endeffekt erhalte ich den Inhalt der Logdatei von einer DLL und bin der einzige, der dieses in eine Datei schreib und wieder ausliest. Bisher habe ich nur deswegen direkt die Werte aus der DLL in die Datei geschrieben, um dort keinen unnötigen Aufwand zu betreiben.</p>
<p>Wie gesagt, kann ich leider nichts genaueres hier zeigen. Aber der Ablauf dürfte klar sein.</p>
<p>@Meep Meep<br />
Helfen dir diese Infos weiter, um mir einen Tipp zur Optimierung zu geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187337</guid><dc:creator><![CDATA[DarkGuardian]]></dc:creator><pubDate>Tue, 05 Dec 2006 14:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Tue, 05 Dec 2006 20:12:19 GMT]]></title><description><![CDATA[<p>re</p>
<p>DarkGuardian schrieb:</p>
<blockquote>
<p>Im Endeffekt erhalte ich den Inhalt der Logdatei von einer DLL und bin der einzige, der dieses in eine Datei schreib und wieder ausliest. Bisher habe ich nur deswegen direkt die Werte aus der DLL in die Datei geschrieben, um dort keinen unnötigen Aufwand zu betreiben.</p>
</blockquote>
<p>also wenn ich dich richtig verstanden habe, dann erhaelst du zuerst die daten von einer dll, shreibst sie in eine datei, und dann willst du (jetzt kommt dein problempunkt) die datei wieder auslesen und irgendwo anzeigen.</p>
<p>ansich kann man da nicht viel dazu sagen ohne source. ih wollte ja auch nicht direkt die log-daten sehen.<br />
bissl source waere aber nicht schlecht.<br />
wie sieht die binaere struktur aus, wie die fehler und hinweistexte. also damit meine ich, wie der code aussieht, der dir das zeugs in die datei meiselt.</p>
<p>fuer 100.000 zeilen 12 minuten ist wirklich katastrophal lahm.<br />
naja haengt auch davon ab wie lange die zeilen sind. sollte aber auch nicht wirklich lange dauern.</p>
<p>kannst vielleicht wenigstens den source fuer die struktur der datei mal posten?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187541</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Tue, 05 Dec 2006 20:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Optimierung mit Strings on Wed, 06 Dec 2006 08:44:47 GMT]]></title><description><![CDATA[<p>Wie ich schon mal gesagt habe wäre es wichtig zu wissen was genau da so lange dauert. Das Einlesen, das Parsen oder was auch immer? Evtl. hilft es die Datei erst in den Speicher zu packen (evtl. auch stückchenweise) und dann zu parsen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1187709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1187709</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 06 Dec 2006 08:44:47 GMT</pubDate></item></channel></rss>