<?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[ein paar Designfragen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe einen kaskadierenden Algorithmus implementiert und möchte diesen nun ein wenig optimieren und dabei vor allem den Code verschönern. Dazu habe ich die folgenden Fragen.</p>
<p>1.) Der Algorithmus ist von einer großen Schleife umgeben. Mit jedem Schleifendurchlauf fällt unten ein &quot;int&quot; raus. Bis jetzt schiebe ich dieses in einen stringstream und formatiere diesen später entsprechend. Aus einem anderen Thread habe ich jedoch erfahren, dass dies wohl ziemlich langsam ist.</p>
<p>Daher möchte ich die &quot;herausfallenden&quot; int's zuerst in einer entsprechenden Struktur abspeichern. Klar, es bietet sich vector&lt;int&gt; an. Damit würde es tatsächlich gehen, doch habe ich versucht ohne die STL zu arbeiten (zur Übung).</p>
<p>Ich weiß aber nicht, wie groß ein etwaiges Array sein wird, sodass ich solch eins auch nicht zur Laufzeit erstellen kann. Ich kann die Größe nur auf eine Zweierpotenz abschätzen, doch da würde ich einfach zu viele Bytes wegschmeißen.</p>
<p>Wie würdet ihr soetwas implementieren ohne STL beziehungsweise wie hätte das in alten C Zeiten funktioniert. Ich hoffe nicht, dass irgendeine KLasse geschrieben wurde, die Arrays automatisch durch ewige Kopiervoränge vergrößert, indem es neue erstellt und das alte reinkopiert.</p>
<p>2.) Ich habe nun meine Datenstruktur mit meinen ints und möchte diese nun so formatieren, dass zum Schluss ein string herauskommen.</p>
<p>Warum ist string.push_back so viel schneller als ein stringstream? Warum sollte ich dann überhaupt stingstreams verwenden. Bis jetzt finde ich dies sehr angenehmen, weil ein solcher ja alles frisst, für den der &lt;&lt; - Operator definiert ist.</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317881/ein-paar-designfragen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 01:27:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317881.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Jun 2013 17:52:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ein paar Designfragen on Sun, 23 Jun 2013 17:52:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe einen kaskadierenden Algorithmus implementiert und möchte diesen nun ein wenig optimieren und dabei vor allem den Code verschönern. Dazu habe ich die folgenden Fragen.</p>
<p>1.) Der Algorithmus ist von einer großen Schleife umgeben. Mit jedem Schleifendurchlauf fällt unten ein &quot;int&quot; raus. Bis jetzt schiebe ich dieses in einen stringstream und formatiere diesen später entsprechend. Aus einem anderen Thread habe ich jedoch erfahren, dass dies wohl ziemlich langsam ist.</p>
<p>Daher möchte ich die &quot;herausfallenden&quot; int's zuerst in einer entsprechenden Struktur abspeichern. Klar, es bietet sich vector&lt;int&gt; an. Damit würde es tatsächlich gehen, doch habe ich versucht ohne die STL zu arbeiten (zur Übung).</p>
<p>Ich weiß aber nicht, wie groß ein etwaiges Array sein wird, sodass ich solch eins auch nicht zur Laufzeit erstellen kann. Ich kann die Größe nur auf eine Zweierpotenz abschätzen, doch da würde ich einfach zu viele Bytes wegschmeißen.</p>
<p>Wie würdet ihr soetwas implementieren ohne STL beziehungsweise wie hätte das in alten C Zeiten funktioniert. Ich hoffe nicht, dass irgendeine KLasse geschrieben wurde, die Arrays automatisch durch ewige Kopiervoränge vergrößert, indem es neue erstellt und das alte reinkopiert.</p>
<p>2.) Ich habe nun meine Datenstruktur mit meinen ints und möchte diese nun so formatieren, dass zum Schluss ein string herauskommen.</p>
<p>Warum ist string.push_back so viel schneller als ein stringstream? Warum sollte ich dann überhaupt stingstreams verwenden. Bis jetzt finde ich dies sehr angenehmen, weil ein solcher ja alles frisst, für den der &lt;&lt; - Operator definiert ist.</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333569</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Sun, 23 Jun 2013 17:52:53 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Sun, 23 Jun 2013 18:06:40 GMT]]></title><description><![CDATA[<p>Hi,</p>
<blockquote>
<p>Der Algorithmus ist von einer großen Schleife umgeben.</p>
</blockquote>
<p>Innere Schleifen kannst Du in Funktionen auslagern, das stört die Performance normalerweise nicht und erhöht die Übersichtlichkeit oft beträchtlich.</p>
<blockquote>
<p>Mit jedem Schleifendurchlauf fällt unten ein &quot;int&quot; raus. Bis jetzt schiebe ich dieses in einen stringstream</p>
</blockquote>
<p>Keine Ahnung, woraus der int fällt und wieso Du den in einen stringstream schiebst.</p>
<blockquote>
<p>Damit würde es tatsächlich gehen, doch habe ich versucht ohne die STL zu arbeiten (zur Übung).</p>
</blockquote>
<p>Willst Du üben oder guten Code erstellen? Auf die STL zu verzichten ist eine ziemlich unbrauchbare Übung, weil Du Dir schlechten Stil angewöhnst.</p>
<blockquote>
<p>Ich kann die Größe nur auf eine Zweierpotenz abschätzen, doch da würde ich einfach zu viele Bytes wegschmeißen.</p>
</blockquote>
<p>vector::resize oder reserve.</p>
<blockquote>
<p>Wie würdet ihr soetwas implementieren ohne STL beziehungsweise wie hätte das in alten C Zeiten funktioniert.</p>
</blockquote>
<p>Ja weißte, dann frag doch einfach im C-Forum nach. Wenn es das optimalste gewesen wäre, hätte man sich vermutlich einen eigenen dynamischen Container generiert. Vermutlich das Anlegen eines großen Speicherbereichs und ein einfaches Mitzählen eines Counters. Wäre der Speicher zu groß, dann eben blockweise Vergrößerung.</p>
<blockquote>
<p>Warum sollte ich dann überhaupt stingstreams verwenden.</p>
</blockquote>
<p>Keine Ahnung, Du sagst ja nicht, was Du machen willst. Eigentlich haben vector&lt;int&gt; und stringstream andere Anwendungsfälle. Der stringstream muss jeden int parsen und als String darstellen. vector&lt;int&gt; konvertiert nichts, ist doch klar, dass er dann schneller ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Beste Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333571</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Sun, 23 Jun 2013 18:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Sun, 23 Jun 2013 19:14:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich weiß aber nicht, wie groß ein etwaiges Array sein wird, sodass ich solch eins auch nicht zur Laufzeit erstellen kann. Ich kann die Größe nur auf eine Zweierpotenz abschätzen, doch da würde ich einfach zu viele Bytes wegschmeißen.</p>
</blockquote>
<p>Im Prinzip kannst du beliebig viel Speicher anfordern da dein Betriebssystem den virtuellen Speicher erst &quot;echten&quot; (=physikalischen) Speicher verpasst sobald er verwendet wird. Also trau es dir ruhig. Du verscchwendest im Worst Case Speiccherseitengröße - 1 Bytes, meistens 4095. Das ist wirklich nicht viel.</p>
<p>Problematisch kann es höchstens bei 32bit System werden da dort auch der virtuelle Speicher recht limitiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333591</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 23 Jun 2013 19:14:27 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 11:12:57 GMT]]></title><description><![CDATA[<p>Eisflamme schrieb:</p>
<blockquote>
<p>Keine Ahnung, woraus der int fällt und wieso Du den in einen stringstream schiebst.</p>
</blockquote>
<p>Ich habe das Horner-Schema zum Wechseln der Zahlenbasis implementiert. Pro Iterationschritt wird eine Ziffer berechnet und &quot;fällt&quot; quais unten aus der Schleife raus --&gt; bildhaft gesprochen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Ja weißte, dann frag doch einfach im C-Forum nach.</p>
</blockquote>
<p>Werde ich machen!</p>
<p>Eisflamme schrieb:</p>
<blockquote>
<p>Der stringstream muss jeden int parsen und als String darstellen.</p>
</blockquote>
<p>Warum muss ein int geparst werden? Unter Parsen stelle ich mir eine Art Syntaxprüfrung vor. Hat ein int eine Syntax?</p>
<p>Ethon schrieb:</p>
<blockquote>
<p>Problematisch kann es höchstens bei 32bit System werden da dort auch der virtuelle Speicher recht limitiert ist.</p>
</blockquote>
<p>Jo, es soll aber auch auf 32 Bit Systemen laufen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Der Tipp ist aber gut. Danke</p>
<p>Verstehe ich euch richtig, dass ihr zum Erstellen eines Strings nicht stringstream verwenden würdet, wenn der Strinhalts die einzelnen Elemente eines std::vector&lt;int&gt; sind?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333785</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:12:57 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 11:32:42 GMT]]></title><description><![CDATA[<blockquote>
<p>kaskadierenden Algorithmus ... fällt unten ein &quot;int&quot; raus ... bildhaft gesprochen</p>
</blockquote>
<p>Damit kann man echt viel anfangen. Dazu kann ich nur sagen: Nimm blau, dann wirds schoener.</p>
<blockquote>
<p>Verstehe ich euch richtig, dass ihr zum Erstellen eines Strings nicht stringstream verwenden würdet, wenn der Strinhalts die einzelnen Elemente eines std::vector&lt;int&gt; sind</p>
</blockquote>
<p>Ich verwende std::to_string. Ansonsten: Was soll string.push_back fuer ints sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333792</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 11:35:24 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Nimm blau, dann wirds schoener.</p>
</blockquote>
<p>OK :D. Danke. Das leuchtet auch ein, weil Cola ja besser als aus dem Glas schmeckt!</p>
<p>knivil schrieb:</p>
<blockquote>
<p>Ich verwende std::to_string.</p>
</blockquote>
<p>und warum muss hier nicht geparst werden? Warum ist es also so viel schneller als die Zahlen in einen stringstream zu schieben?</p>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333795</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:35:24 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 11:36:35 GMT]]></title><description><![CDATA[<blockquote>
<p>Warum ist string.push_back so viel schneller als ein stringstream?</p>
</blockquote>
<p>Welchen Datentyp hat in dieser Aussage das Objekt <code>string</code> ?</p>
<blockquote>
<p>und warum muss hier nicht geparst werden?</p>
</blockquote>
<p>Wo schreibe ich das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333796</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:36:35 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 11:40:20 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Warum ist string.push_back so viel schneller als ein stringstream?</p>
</blockquote>
<p>Welchen Datentyp hat in dieser Aussage das Objekt <code>string</code> ?</p>
</blockquote>
<p>?<br />
string</p>
<p>knivil schrieb:</p>
<blockquote>
<p>Wo schreibe ich das?</p>
</blockquote>
<p>nirgendswo. Aber das schließe ich daraus. Anscheinend ist stringstream ja so langsam, weil die Zahlen zuvor geparst werden. Wenn std::to_string so viel schneller ist, schließe ich daraus, dass hier nicht gepart wird (jaja, sehr gewagt^^). Wo liegt dann der Performancegewinn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333799</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:40:20 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 11:56:32 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn std::to_string so viel schneller ist</p>
</blockquote>
<p>Wo schreibe ich das? Ich habe keinen Performancevergleich getaetigt.</p>
<blockquote>
<p>Aber das schließe ich daraus.</p>
</blockquote>
<p>Du gehst von Annahmen aus, die so nicht gegeben sind. Liesst Dinge, die so nicht da sind. Was du schliesst, entbehrt jeder Logik. Hoere auf damit!</p>
<blockquote>
<p>?<br />
string</p>
</blockquote>
<p>Nun, ich kenne kein string::push_back(int). Diese Methode nimmt fuer gewoehnlich ein char als Parameter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333811</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:56:32 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 11:56:31 GMT]]></title><description><![CDATA[<p>Anscheinend hast Du meinen Punkt nicht verstanden. Mir geht es hier um eine effizientere Lösung für stringstream &lt;&lt; int. In einem anderen Thread habe ich erfahren, dass dies nämlich so wegen eines Parsingvorgangs nicht sehr schnell ist.</p>
<p>Wie würdest Du möglichst schnell integer an einen String anfügen?</p>
<p>Du hast von std::to_string gesprochen. Also gehen ich davon aus, dass dies wohl recht flott geht. Mich interessiert warum. Falls dies ebenfalls langsam ist: Warum benutzt Du es?</p>
<p>Vielen Dank<br />
LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333817</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 24 Jun 2013 11:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 12:02:08 GMT]]></title><description><![CDATA[<blockquote>
<p>Warum ist string.push_back so viel schneller als ein stringstream? Mir geht es hier um eine effizientere Lösung für stringstream &lt;&lt; int.</p>
</blockquote>
<p>Deine falsche Vorstellung von Geschwindigkeit ruehrt vielleicht daher, dass du string::push_back falsch benutzt hast. Bitte korrigiere diese Vorstellung oder begruende mit aussagekraeftigen Zahlen oder Verweisen.</p>
<blockquote>
<p>Wie würdest Du möglichst schnell integer an einen String anfügen?</p>
</blockquote>
<pre><code class="language-cpp">mein_string += std::to_string(mein_int);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2333822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333822</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:02:08 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 12:03:24 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>schreibe ich das? Ich habe keinen Performancevergleich getaetigt.</p>
</blockquote>
<p>Ich aber!</p>
<p>knivil schrieb:</p>
<blockquote>
<p>Was du schliesst, entbehrt jeder Logik. Hoere auf damit!</p>
</blockquote>
<p>is ja gut...dafür hättest Du deinen Beitrag nicht änder müssen. char puhh[8] = {67,72,73,76,76,77,65,76};</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333824</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:03:24 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 12:05:35 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Anscheinend hast Du meinen Punkt nicht verstanden. Mir geht es hier um eine effizientere Lösung für stringstream &lt;&lt; int. In einem anderen Thread habe ich erfahren, dass dies nämlich so wegen eines Parsingvorgangs nicht sehr schnell ist.</p>
</blockquote>
<p>Jein. std::stringstream ist lahm, weil im Hintergrund wegen Formatierung und Fehlerprüfung und generellem Overhead da total viel passiert.</p>
<blockquote>
<p>Du hast von std::to_string gesprochen. Also gehen ich davon aus, dass dies wohl recht flott geht. Mich interessiert warum. Falls dies ebenfalls langsam ist: Warum benutzt Du es?</p>
</blockquote>
<p>Weil std::to_string() sich den ganzen Stress mit Formatierung spaart, das Ergebnis nicht buffert und geringen Overhead hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333826</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:05:35 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 12:06:25 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<pre><code class="language-cpp">mein_string += std::to_string(mein_int);
</code></pre>
</blockquote>
<p>Gut. Danke! Mich interessiert, warum dies schnell ist. Dies ist ja deine Antwort auf meine Frage, wie &quot;Du möglichst <strong>schnell</strong> integer an einen String anfügen&quot; würdest. Ist dies schneller als stringstream &lt;&lt; int? Wenn ja, warum?</p>
<p>knivil schrieb:</p>
<blockquote>
<p>vielleicht daher, dass du string::push_back falsch benutzt hast.</p>
</blockquote>
<p>Ich benutze diese Methode gar nicht, sondern habe ich aus einem anderen Thread. Bis jetzt geht es bei mir nur um die Nutzung von stringstream und eventuell um deine Art.</p>
<p>Danke dir <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333828</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 24 Jun 2013 12:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 13:08:23 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich aber!</p>
</blockquote>
<p>Dann stelle dein Testprogramm und deren Ergebnisse zur Diskussion. Wenn dein Programm string::push_back verwendet ... gute Nacht.</p>
<blockquote>
<p>diese Methode gar nicht, sondern habe ich aus einem anderen Thread</p>
</blockquote>
<p>Dann sag doch mal mit was du verglichen hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333872</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 13:08:23 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 13:14:09 GMT]]></title><description><![CDATA[<p>Wenn das schnell sein muss: Selber basteln! stringstreams haben viel overhead und auch to_string legt eine unnötige Kopie an.</p>
<pre><code>void append(std::string&amp; s, int value, int radix=10)
{
    if(value &lt; 0)
    {
        s.push_back('-');
        value = -value;
    }

    assert(radix &gt; 1 &amp;&amp; radix &lt; 17);
    char const* chars = &quot;0123456789abcdef&quot;;

    char buffer[sizeof(int) * CHAR_BIT];
    char* iter = buffer;
    while(value &gt;= radix)
    {
        *iter = chars[value % radix];
        value /= radix;
        ++iter;
    }
    *iter = chars[value];

    s.append(std::reverse_iterator&lt;char*&gt;(iter + 1), std::reverse_iterator&lt;char*&gt;(buffer));
}
</code></pre>
<p>Ziemlich optimal so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333880</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 24 Jun 2013 13:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 14:12:40 GMT]]></title><description><![CDATA[<blockquote>
<p>char buffer[sizeof(int) * CHAR_BIT];</p>
</blockquote>
<p>Sehr kryptische Groessenangabe. Warum genau so, wenn fuer 32 Bit, Stellen ausreichen 11 Stellen ausreichen und fuer 64 Bit eben 21 Stellen genuegen? Klar, wenns binar sein soll, aber das ist nicht die Anforderung. Deswegen bezweifle ich, dass es ziemlich optimal ist, weil eben generalisiert wurde.</p>
<p>Schaut man sich andere Implementierungen so fuellen sie den Buffer gleich von hinten und kopieren mit memcpy und Co.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333912</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 14:12:40 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 15:35:58 GMT]]></title><description><![CDATA[<p>Der Code gefällt mir. Man könnte es noch effizienter machen, wenn man das ganze über eine Loopup-Tabelle regelt:</p>
<pre><code>char const* chars[90] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
</code></pre>
<p>LG, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333943</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 24 Jun 2013 15:35:58 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 15:43:28 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Der Code gefällt mir. Man könnte es noch effizienter machen, wenn man das ganze über eine Loopup-Tabelle regelt:</p>
</blockquote>
<p>1. Low-Level-Code != effizient<br />
2. &quot;gefallen&quot; ist subjektiv, Performance muss man <em>messen</em>!<br />
3. Jedes vnprintf ist schneller als das Gehacke von Ethon.<br />
4. Dein Vorschlag ist Quatsch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333946</guid><dc:creator><![CDATA[performer]]></dc:creator><pubDate>Mon, 24 Jun 2013 15:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 15:46:09 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>char buffer[sizeof(int) * CHAR_BIT];</p>
</blockquote>
<p>Sehr kryptische Groessenangabe. Warum genau so, wenn fuer 32 Bit, Stellen ausreichen 11 Stellen ausreichen und fuer 64 Bit eben 21 Stellen genuegen? Klar, wenns binar sein soll, aber das ist nicht die Anforderung. Deswegen bezweifle ich, dass es ziemlich optimal ist, weil eben generalisiert wurde.</p>
<p>Schaut man sich andere Implementierungen so fuellen sie den Buffer gleich von hinten und kopieren mit memcpy und Co.</p>
</blockquote>
<p>Stackspeicher zu verschwenden ist doch ziemlich egal.<br />
In welche Richtung man den Buffer befüllt ist auch egal.<br />
Und memcpy bringt bei solchen kleinen Eingabemengen wohl reichlich wenig, mit Pech wird's sogar langsamer.</p>
<p>Ich würde am ehesten kritisieren dass nicht direkt in den String geschrieben wird. Müsste man eben den String zuerst vergrößern. Bezweifle aber dass sich das lohnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333949</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 24 Jun 2013 15:46:09 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 16:01:50 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>In welche Richtung man den Buffer befüllt ist auch egal.<br />
Und memcpy bringt bei solchen kleinen Eingabemengen wohl reichlich wenig, mit Pech wird's sogar langsamer.</p>
</blockquote>
<p>Irrtum. Wenns gleich in der richtigen Reihenfolge wäre, könnte man alles als <code>uint64_t</code> kopieren.</p>
<p>So muss aus dem Array jeder einzelne char extrahiert werden (char extrahieren ist teurer als int extrahieren) und ausserdem muss 4x so häufig kopiert werden.</p>
<p>Wer ganz klug ist, speichert gleich alle Zahlentripel in der Tabelle vor (&quot;000&quot;, &quot;001&quot;, ..., &quot;999&quot;) und macht tripel[zahl%1000].</p>
<p>Weisst du, wer so klug ist? vnprintf! Das ist ein Compiler-Builtin, das gleich in den schnellstmöglichen Code der jeweiligen Plattform umgesetzt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333955</guid><dc:creator><![CDATA[performer]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:01:50 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 16:12:56 GMT]]></title><description><![CDATA[<p>performer schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>In welche Richtung man den Buffer befüllt ist auch egal.<br />
Und memcpy bringt bei solchen kleinen Eingabemengen wohl reichlich wenig, mit Pech wird's sogar langsamer.</p>
</blockquote>
<p>Irrtum. Wenns gleich in der richtigen Reihenfolge wäre, könnte man alles als <code>uint64_t</code> kopieren.</p>
<p>So muss aus dem Array jeder einzelne char extrahiert werden (char extrahieren ist teurer als int extrahieren) und ausserdem muss 4x so häufig kopiert werden</p>
</blockquote>
<p>Kommt nun darauf an wie groß eine durchschnittliche Zahl ist. Wenn man es mit 64bit Integern macht dann kommen noch Conditionals dazu. Solange man keinen Test schreibt kann man nur raten.<br />
Allerdings sehe ich nicht warum man nicht auch rückwärts ganze Wörter anstatt Bytes schreiben können sollte.</p>
<p>performer schrieb:</p>
<blockquote>
<p>Wer ganz klug ist, speichert gleich alle Zahlentripel in der Tabelle vor (&quot;000&quot;, &quot;001&quot;, ..., &quot;999&quot;) und macht tripel[zahl%1000].</p>
<p>Weisst du, wer so klug ist? vnprintf! Das ist ein Compiler-Builtin, das gleich in den schnellstmöglichen Code der jeweiligen Plattform umgesetzt wird.</p>
</blockquote>
<p>Denkst du das ist so klug? 1000 * sizeof(char*) sind allein schon 4k/8k Bytes - dann noch die Strings, die möglicherweise woanders im statischen Speicher liegen ... klingt nicht sehr optimal, lieber ein paar Schleifendurchläufe extra als nen Cachemiss zu riskieren.</p>
<blockquote>
<p>3. Jedes vnprintf ist schneller als das Gehacke von Ethon.</p>
</blockquote>
<p>Zeig mal Beispielscode. Google spuckt zu vnprintf nichts aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333961</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:12:56 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 16:20:58 GMT]]></title><description><![CDATA[<blockquote>
<p>1. Low-Level-Code != effizient</p>
</blockquote>
<p>Lookup-Tabellen sind so gut wie immer das Effizienteste, wenn sie eben möglich sind. Somit stimme ich hier absolut zu, das ist an Performance kaum zu schlagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333967</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:20:58 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 16:53:15 GMT]]></title><description><![CDATA[<p>Ich weiss nicht warum immer an eigenen Meinungen festgehalten wird. Nachmessen! Aber die Muehe macht sich niemand bei so Spielzeugbeispielen, da der Flaschenhals meist woanders liegt.</p>
<blockquote>
<p>Lookup-Tabellen sind so gut wie immer das Effizienteste</p>
</blockquote>
<p>Das haengt auch entscheidend von der Groesse der Tabelle, dem Cache und der Prozessorarchitektur ab.</p>
<p>Was kann verbessert werden: Wird sich auf die Ziffern 0-9 beschraenkt, also Radix = 10, dann verschwindet die Lookuptabelle.</p>
<pre><code class="language-cpp">*iter = '0' + (value % Radix);
</code></pre>
<p>Falls Radix = 16 ist, so baut man ein if ein. Ob das schneller als ein Speicherzugriff ist, muss gemessen werden. Weiterhin kann die Lookuptabelle bei 64 Bit Architekturen in 2 Registern vorgehalten werden, d.h. Register auswaehlen + shift bleibt dann uebrig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333982</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 24 Jun 2013 16:53:15 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Mon, 24 Jun 2013 17:09:22 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Was kann verbessert werden: Wird sich auf die Ziffern 0-9 beschraenkt, also Radix = 10, dann verschwindet die Lookuptabelle.</p>
<pre><code class="language-cpp">*iter = '0' + (value % Radix);
</code></pre>
<p>Falls Radix = 16 ist, so baut man ein if ein. Ob das schneller als ein Speicherzugriff ist, muss gemessen werden. Weiterhin kann die Lookuptabelle bei 64 Bit Architekturen in 2 Registern vorgehalten werden, d.h. Register auswaehlen + shift bleibt dann uebrig.</p>
</blockquote>
<p>Ist langsamer als die Lookup-Tabelle. (gcc 4.7, -03, irgeineine i7 mobile CPU)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2333996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2333996</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 24 Jun 2013 17:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to ein paar Designfragen on Tue, 25 Jun 2013 00:47:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Ist langsamer als die Lookup-Tabelle. (gcc 4.7, -03, irgeineine i7 mobile CPU)</p>
</blockquote>
<p>Das ist eine sehr vage Aussage. Testprogramm und Ergebnisse fehlen. Auch ist mobile CPU sehr duerftig. Klar kann ich heir meinen STM32F ausbuddeln und dann wird es ganz anderes aussehen.</p>
<p>Aus eigener Erfahrung weiss ich, dass -O3 schlechter sein kann als -O2. Mal schauen, wann ich Zeit fuer deine Herausforderung habe. Es gibt ja noch mehr Moeglichkeiten der Optimierung. Fuer gewoehnlich ist nur die Basis 2, 8, 16 und eben 10 interessant. Fuer 2 8, und 16 kann beispielsweise die Modulo-Operation wegfallen.</p>
<p>Und dann koennen sie gern gegen irgendwas hier antreten: <a href="http://stackoverflow.com/questions/4351371/c-performance-challenge-integer-to-stdstring-conversion" rel="nofollow">http://stackoverflow.com/questions/4351371/c-performance-challenge-integer-to-stdstring-conversion</a></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18082">@freakC</a>++: google: fastest integer to string conversion c++</p>
<p>Und zu deiner Frage: Ich benutze std::to_string, weil es nur eine Zeile Code ist. Flaschenhaelse treten normalerweise zuerst woanders auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334108</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 25 Jun 2013 00:47:57 GMT</pubDate></item></channel></rss>