<?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[Facets langsamer als normal]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe zwei split()-Funktionen geschrieben, die einen <code>vector&lt;string&gt;</code> zurückgeben. Die erste Version habe ich mit einer selbstdefinierten <code>ctype</code> -Facet gemacht, die zweite Version ganz einfach mit <code>stream.get(c);</code> und dann auf c prüfen, ob es ein Delimiter ist.</p>
<p>Was mir jedoch aufgefallen ist, ist, dass die Variante mit der Facet rund zweimal langsamer ist, als ersteres.</p>
<p>Warum also sollte ich hier Facets verwenden?<br />
Wo machen Facets denn eigentlich noch Sinn, wenn sie langsamer sind?</p>
<p>Kann man eigentlich sagen, dass die IOstreams irgendwo performancemäßig für die Katz ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339620/facets-langsamer-als-normal</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 02:23:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339620.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Sep 2016 09:06:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 09:06:39 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe zwei split()-Funktionen geschrieben, die einen <code>vector&lt;string&gt;</code> zurückgeben. Die erste Version habe ich mit einer selbstdefinierten <code>ctype</code> -Facet gemacht, die zweite Version ganz einfach mit <code>stream.get(c);</code> und dann auf c prüfen, ob es ein Delimiter ist.</p>
<p>Was mir jedoch aufgefallen ist, ist, dass die Variante mit der Facet rund zweimal langsamer ist, als ersteres.</p>
<p>Warum also sollte ich hier Facets verwenden?<br />
Wo machen Facets denn eigentlich noch Sinn, wenn sie langsamer sind?</p>
<p>Kann man eigentlich sagen, dass die IOstreams irgendwo performancemäßig für die Katz ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508638</guid><dc:creator><![CDATA[Facette]]></dc:creator><pubDate>Wed, 14 Sep 2016 09:06:39 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 09:54:33 GMT]]></title><description><![CDATA[<p>Bin irgendwie hierauf gestoßen und ich finde das könnte interessant/relevant sein: <a href="http://info.prelert.com/blog/stdgetline-is-the-poor-relation" rel="nofollow">http://info.prelert.com/blog/stdgetline-is-the-poor-relation</a><br />
P.S.: Ich kann keinerlei Aussagen über die Qualität der Quelle machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508649</guid><dc:creator><![CDATA[HarteWare]]></dc:creator><pubDate>Wed, 14 Sep 2016 09:54:33 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 10:05:10 GMT]]></title><description><![CDATA[<p>Ich kenne mich zwar nicht mit Assembler aus, aber der Code mit der Facet beträgt rund 5 Mal mehr Zeilen, als ohne.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508651</guid><dc:creator><![CDATA[Facette]]></dc:creator><pubDate>Wed, 14 Sep 2016 10:05:10 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 10:08:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Was mir jedoch aufgefallen ist, ist, dass die Variante mit der Facet rund zweimal langsamer ist, als ersteres.</p>
</blockquote>
<p>Debug oder Release-Mode (mit/ohne Optimierung)</p>
<blockquote>
<p>Kann man eigentlich sagen, dass die IOstreams irgendwo performancemäßig für die Katz ist?</p>
</blockquote>
<p>Ja Streams sind langsam</p>
<blockquote>
<p>Ich kenne mich zwar nicht mit Assembler aus, aber der Code mit der Facet beträgt rund 5 Mal mehr Zeilen, als ohne.</p>
</blockquote>
<p>Assemblerlisting? - für Debug oder Release-Mode (mit/ohne Optimierung)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508652</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Wed, 14 Sep 2016 10:08:13 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 11:30:06 GMT]]></title><description><![CDATA[<p>Facette schrieb:</p>
<blockquote>
<p>ich habe zwei split()-Funktionen geschrieben, die einen <code>vector&lt;string&gt;</code> zurückgeben. Die erste Version habe ich mit einer selbstdefinierten <code>ctype</code> -Facet gemacht, die zweite Version ganz einfach mit <code>stream.get(c);</code> und dann auf c prüfen, ob es ein Delimiter ist.</p>
<p>Was mir jedoch aufgefallen ist, ist, dass die Variante mit der Facet rund zweimal langsamer ist, als ersteres.</p>
</blockquote>
<p>Stell doch den Code mit Facette hier ein, vielleicht macht Du den Fehler in einer Schleife jedesmal <code>use_facet&lt;&gt;</code> zu rufen ...</p>
<p>Facette schrieb:</p>
<blockquote>
<p>Warum also sollte ich hier Facets verwenden?<br />
Wo machen Facets denn eigentlich noch Sinn, wenn sie langsamer sind?</p>
</blockquote>
<p>das hat mit Geschwindigkeit nichts zu tun, sondern mit Austauschbarkeit. Mit Facetten kannst Du das Verhalten beim Lesen und Schreiben an die lokalen Gegebenheiten anpassen (z.B. Zeit, Datum, Dezimaltrenner, Währung).</p>
<p>Facette schrieb:</p>
<blockquote>
<p>Kann man eigentlich sagen, dass die IOstreams irgendwo performancemäßig für die Katz ist?</p>
</blockquote>
<p>Das ist gefühlt tausendfach im I-net zu lesen. Es kommt i.A. immer darauf an WIE man sie benutzt und was man erwartet. Beispiel: <a href="https://www.c-plusplus.net/forum/310076-full">https://www.c-plusplus.net/forum/310076-full</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508670</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 14 Sep 2016 11:30:06 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 11:52:32 GMT]]></title><description><![CDATA[<p>Ich mach das so:</p>
<pre><code class="language-cpp">class joiner_ctype : public std::ctype&lt;char&gt;{
    mask table[table_size];

public:
    joiner_ctype(const std::basic_string&lt;char&gt;&amp; separators, std::size_t refs = 0)
        : std::ctype&lt;char&gt;(table, false, refs){
        std::copy_n(classic_table(), table_size, table);

        for(auto c : separators)
            table[(std::size_t)c] = (mask)space;
    }
};

std::vector&lt;std::string&gt; split(std::istream&amp; stream, const std::string&amp; delimiters){
    auto locale = stream.getloc();
    stream.imbue(std::locale(locale, new joiner_ctype(delimiters)));

    std::vector&lt;std::string&gt; parts;
    std::string s;

    while(stream &gt;&gt; s)
        parts.push_back(std::move(s));

    stream.imbue(locale);

    return parts;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2508677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508677</guid><dc:creator><![CDATA[Facette]]></dc:creator><pubDate>Wed, 14 Sep 2016 11:52:32 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 12:02:41 GMT]]></title><description><![CDATA[<p>Ich kompiliere im Release-Modus mit -O2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508680</guid><dc:creator><![CDATA[Facette]]></dc:creator><pubDate>Wed, 14 Sep 2016 12:02:41 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 12:38:36 GMT]]></title><description><![CDATA[<p>ich kann Deine Messung nicht nachvollziehen. Bei mir (Windows 7, Visual Studio 12) ist eine Version mit <code>stream.get(c)</code> fast zweimal langsamer.<br />
Datei ca. 140kB; Strings zwischen 4 und 10 Zeichen lang; Semikolon als Trenner<br />
mit facet: 6ms; mit stream.get(c): 11ms<br />
mit getline übrigens nur 4ms - Nachteil ist hier, dass nur ein Zeichen als Delimiter möglich ist.</p>
<p>Wenn Du mehr als ein Zeichen als Delimiter zulässt, dann drängt sich bei mir der Verdacht auf, dass Du Deine Strings anschließend noch verarbeitest, bevor Du zu den Daten kommst, die Du wirklich benötigst. Wenn dem so ist, so ist das 'Einlesen' nach <code>split</code> noch nicht beendet!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508683</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 14 Sep 2016 12:38:36 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 13:30:00 GMT]]></title><description><![CDATA[<p>Mist, ich hab falsch gemessen.<br />
Danke, das war der Fehler.<br />
Facets sind schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508692</guid><dc:creator><![CDATA[Facette]]></dc:creator><pubDate>Wed, 14 Sep 2016 13:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Wed, 14 Sep 2016 15:47:28 GMT]]></title><description><![CDATA[<p>HarteWare schrieb:</p>
<blockquote>
<p>Bin irgendwie hierauf gestoßen und ich finde das könnte interessant/relevant sein: <a href="http://info.prelert.com/blog/stdgetline-is-the-poor-relation" rel="nofollow">http://info.prelert.com/blog/stdgetline-is-the-poor-relation</a><br />
P.S.: Ich kann keinerlei Aussagen über die Qualität der Quelle machen.</p>
</blockquote>
<p>Interessant wäre mMn. ein Vergleich zwischen dem dort geposteten Code und folgender kleinen Änderung:</p>
<pre><code class="language-cpp">void populateVec(std::vector&lt;std::string&gt; &amp;vec)
{
    vec.clear();
    std::ifstream dataStrm(&quot;farequote.csv&quot;);
    std::string line;
    while (std::getline(dataStrm, line))
    {
        //vec.push_back(std::move(line));
        vec.push_back(line);
    }
}
</code></pre>
<p>Würde mich nicht wundern wenn das dadurch deutlich schneller würde. Wenn ich nicht vergesse probier' ich das heute Abend mal aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508697</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 14 Sep 2016 15:47:28 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Thu, 15 Sep 2016 23:45:18 GMT]]></title><description><![CDATA[<p>So.<br />
Habe jetzt gemessen. Verdacht bestätigt. Die kopierende Version ist mit meinem Test-Code (VC++2015) und Test-File (1000 Zeilen mit zufälliger Länge bis ~300 Zeichen) um ca. 20% schneller als die movende.</p>
<p>Ratespiel: Wer weiss wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508792</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 15 Sep 2016 23:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Fri, 16 Sep 2016 07:27:17 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>So.<br />
Habe jetzt gemessen. Verdacht bestätigt. Die kopierende Version ist mit meinem Test-Code (VC++2015) und Test-File (1000 Zeilen mit zufälliger Länge bis ~300 Zeichen) um ca. 20% schneller als die movende.</p>
<p>Ratespiel: Wer weiss wieso?</p>
</blockquote>
<p>Ich vermute das liegt an std::getline wenn diese methode zeichenweise elemente zum string hinzufügt gibt es öfters reallokationen.<br />
Durch das move wird die std::string instance &quot;line&quot; komplett &quot;leer&quot;.</p>
<p>Eine kopie des string ist vermutlich sehr effizient implementiert (eventuell als allokation + memcopy implementiert)</p>
<p>Bei deiner Variante behält line seinen internen buffer -&gt; bei 2 und folgenden aufrufen von std::getline werden gar keine oder nur sehr wenige reallokationen notwendig. Wenn in deinem Beispiel vom programm einmal eine 300 zeichen zeile eingelesen wurde (welches bei dir das maximum ist), so muss std::string später keinerlei reallokation mehr machen.</p>
<p>Was ich mir noch vorstellen könnte, das eventuell eine variante mit std::vector::emplace_back statt std::vector::push_back bei deiner variante nochmal minimal schneller ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508795</guid><dc:creator><![CDATA[firefly]]></dc:creator><pubDate>Fri, 16 Sep 2016 07:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Fri, 16 Sep 2016 06:59:31 GMT]]></title><description><![CDATA[<p>Ja, so würde ich das auch interpretieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508796</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Fri, 16 Sep 2016 06:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to Facets langsamer als normal on Fri, 16 Sep 2016 09:25:28 GMT]]></title><description><![CDATA[<p><code>emplace_back</code> bringt keine weitere (messbare) Verbesserung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2508802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2508802</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 16 Sep 2016 09:25:28 GMT</pubDate></item></channel></rss>