<?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[Geschwindigkeit von STL numerics]]></title><description><![CDATA[<p>Hallo,<br />
ich habe zwei Funktionen verglichen, die mir den Korrelationskoeffizienten zweier Zahlenlisten berechnen. Die eine benutzt STL-Funktionen, die andere berechnet die benoetigten Summen &quot;von Hand&quot;. Bei einer Listenlaenge von je 1000000 double's:x<br />
benoetigt die STL-Version 130000 clock ticks waehrend die &quot;von Hand&quot; Version nur 70000 benoetigt (kompiliert mit g++ -O2 -march=k6 test.cpp).</p>
<p>Kann mir jemand erklaeren, woran das liegt? Ich haette erwartet, dass die STL vergleichbar, wenn nicht gar schneller waere. Hier der Code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;numeric&gt;
#include &lt;cmath&gt;
#include &lt;vector&gt;
#include &lt;time.h&gt;

// compare two versions of calculating correlation coefficients
// using STL functions
template &lt;typename T&gt; T CC_stl(const std::vector&lt;T&gt;&amp; l1,
                               const std::vector&lt;T&gt;&amp; l2)
{
    T corr_coefficient;
    T sum1, sum1_sq, sum2, sum2_sq, sum12;
    T nominator;
    T denominator;

    int list_size = l1.size();

    sum1    = std::accumulate(l1.begin(), l1.end(), 0.0);
    sum2    = std::accumulate(l2.begin(), l2.end(), 0.0);
    sum1_sq = std::inner_product(l1.begin(), l1.end(), l1.begin(), 0.0);
    sum2_sq = std::inner_product(l2.begin(), l2.end(), l2.begin(), 0.0);
    sum12   = std::inner_product(l1.begin(), l1.end(), l2.begin(), 0.0);

    nominator   = sum12 - sum1*sum2/list_size;
    denominator =   (sum1_sq - sum1*sum1/list_size)
        * (sum2_sq - sum2*sum2/list_size);
    corr_coefficient = nominator / std::sqrt(denominator);
    return corr_coefficient;
}

// manual calculation
template &lt;typename T&gt; T CC(const std::vector&lt;T&gt;&amp; l1, const std::vector&lt;T&gt;&amp; l2)
{
    T corr_coefficient;
    T sum1, sum1_sq, sum2, sum2_sq, sum12;
    T nominator;
    T denominator;

    sum1 = sum2 = sum1_sq = sum2_sq = sum12 = 0;

    int list_size = l1.size();

    for ( int i = 0; i &lt; list_size; i++)
    {
        sum1    += l1[i];
        sum2    += l2[i];
        sum1_sq += l1[i]*l1[i];
        sum2_sq += l2[i]*l2[i];
        sum12   += l1[i]*l2[i];
    }

    nominator   = sum12 - 1.0*sum1/list_size * sum2;
    denominator = (sum1_sq - 1.0/list_size * sum1*sum1) *
                  (sum2_sq - 1.0/list_size * sum2*sum2);

    corr_coefficient = nominator / std::sqrt(denominator);
    return corr_coefficient;
}

int main()
{
    const unsigned int points = 1000000;
    std::vector&lt;double&gt; l1(points), l2(points);

    clock_t stl0, stl1, std0, std1;

    // populate both vectors with numbers
    for ( int i = 0; i &lt; points; i++)
    {
        l1[i] = std::sqrt(1.0*i);
        l2[i] = 1.0/(i+1);
    }

    stl0 = clock();
    double cc_stl = CC_stl(l1, l2);
    stl1 = clock();

    std0 = clock();
    double cc_std = CC(l1, l2);
    std1 = clock();

    std::cout &lt;&lt; &quot; STL Version:    &quot; &lt;&lt; cc_stl &lt;&lt; &quot; clocks: &quot;
              &lt;&lt; stl1 - stl0 &lt;&lt; '\n'
              &lt;&lt; &quot; Normal Version: &quot; &lt;&lt; cc_std &lt;&lt; &quot; clocks: &quot;
              &lt;&lt; std1 - std0 &lt;&lt; '\n';

    return 0;
}
</code></pre>
<p>Vielen Dank,</p>
<p>Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/122499/geschwindigkeit-von-stl-numerics</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 01:41:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/122499.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Oct 2005 12:32:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Geschwindigkeit von STL numerics on Thu, 06 Oct 2005 12:32:45 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe zwei Funktionen verglichen, die mir den Korrelationskoeffizienten zweier Zahlenlisten berechnen. Die eine benutzt STL-Funktionen, die andere berechnet die benoetigten Summen &quot;von Hand&quot;. Bei einer Listenlaenge von je 1000000 double's:x<br />
benoetigt die STL-Version 130000 clock ticks waehrend die &quot;von Hand&quot; Version nur 70000 benoetigt (kompiliert mit g++ -O2 -march=k6 test.cpp).</p>
<p>Kann mir jemand erklaeren, woran das liegt? Ich haette erwartet, dass die STL vergleichbar, wenn nicht gar schneller waere. Hier der Code:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;numeric&gt;
#include &lt;cmath&gt;
#include &lt;vector&gt;
#include &lt;time.h&gt;

// compare two versions of calculating correlation coefficients
// using STL functions
template &lt;typename T&gt; T CC_stl(const std::vector&lt;T&gt;&amp; l1,
                               const std::vector&lt;T&gt;&amp; l2)
{
    T corr_coefficient;
    T sum1, sum1_sq, sum2, sum2_sq, sum12;
    T nominator;
    T denominator;

    int list_size = l1.size();

    sum1    = std::accumulate(l1.begin(), l1.end(), 0.0);
    sum2    = std::accumulate(l2.begin(), l2.end(), 0.0);
    sum1_sq = std::inner_product(l1.begin(), l1.end(), l1.begin(), 0.0);
    sum2_sq = std::inner_product(l2.begin(), l2.end(), l2.begin(), 0.0);
    sum12   = std::inner_product(l1.begin(), l1.end(), l2.begin(), 0.0);

    nominator   = sum12 - sum1*sum2/list_size;
    denominator =   (sum1_sq - sum1*sum1/list_size)
        * (sum2_sq - sum2*sum2/list_size);
    corr_coefficient = nominator / std::sqrt(denominator);
    return corr_coefficient;
}

// manual calculation
template &lt;typename T&gt; T CC(const std::vector&lt;T&gt;&amp; l1, const std::vector&lt;T&gt;&amp; l2)
{
    T corr_coefficient;
    T sum1, sum1_sq, sum2, sum2_sq, sum12;
    T nominator;
    T denominator;

    sum1 = sum2 = sum1_sq = sum2_sq = sum12 = 0;

    int list_size = l1.size();

    for ( int i = 0; i &lt; list_size; i++)
    {
        sum1    += l1[i];
        sum2    += l2[i];
        sum1_sq += l1[i]*l1[i];
        sum2_sq += l2[i]*l2[i];
        sum12   += l1[i]*l2[i];
    }

    nominator   = sum12 - 1.0*sum1/list_size * sum2;
    denominator = (sum1_sq - 1.0/list_size * sum1*sum1) *
                  (sum2_sq - 1.0/list_size * sum2*sum2);

    corr_coefficient = nominator / std::sqrt(denominator);
    return corr_coefficient;
}

int main()
{
    const unsigned int points = 1000000;
    std::vector&lt;double&gt; l1(points), l2(points);

    clock_t stl0, stl1, std0, std1;

    // populate both vectors with numbers
    for ( int i = 0; i &lt; points; i++)
    {
        l1[i] = std::sqrt(1.0*i);
        l2[i] = 1.0/(i+1);
    }

    stl0 = clock();
    double cc_stl = CC_stl(l1, l2);
    stl1 = clock();

    std0 = clock();
    double cc_std = CC(l1, l2);
    std1 = clock();

    std::cout &lt;&lt; &quot; STL Version:    &quot; &lt;&lt; cc_stl &lt;&lt; &quot; clocks: &quot;
              &lt;&lt; stl1 - stl0 &lt;&lt; '\n'
              &lt;&lt; &quot; Normal Version: &quot; &lt;&lt; cc_std &lt;&lt; &quot; clocks: &quot;
              &lt;&lt; std1 - std0 &lt;&lt; '\n';

    return 0;
}
</code></pre>
<p>Vielen Dank,</p>
<p>Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886392</guid><dc:creator><![CDATA[tim_g]]></dc:creator><pubDate>Thu, 06 Oct 2005 12:32:45 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit von STL numerics on Thu, 06 Oct 2005 12:53:02 GMT]]></title><description><![CDATA[<p>Bei der handgeschriebenen Variante machst du ja alles in einer Schleife und in der STL müssen ja 5 mal der ganze Vektor durchlaufen werden?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886407</guid><dc:creator><![CDATA[?!?!]]></dc:creator><pubDate>Thu, 06 Oct 2005 12:53:02 GMT</pubDate></item><item><title><![CDATA[Reply to Geschwindigkeit von STL numerics on Thu, 06 Oct 2005 13:17:07 GMT]]></title><description><![CDATA[<p>ich hab mal den source genommen und bei mir kompiliert, folgende ergebnisse:</p>
<blockquote>
<p>STL Version: -0.0251371 clocks: 234<br />
Normal Version: -0.0251371 clocks: 282</p>
<p>STL Version: -0.0251371 clocks: 250<br />
Normal Version: -0.0251371 clocks: 266</p>
<p>STL Version: -0.0251371 clocks: 234<br />
Normal Version: -0.0251371 clocks: 282</p>
<p>STL Version: -0.0251371 clocks: 234<br />
Normal Version: -0.0251371 clocks: 266</p>
<p>STL Version: -0.0251371 clocks: 234<br />
Normal Version: -0.0251371 clocks: 282</p>
<p>STL Version: -0.0251371 clocks: 250<br />
Normal Version: -0.0251371 clocks: 266</p>
<p>STL Version: -0.0251371 clocks: 250<br />
Normal Version: -0.0251371 clocks: 266</p>
<p>STL Version: -0.0251371 clocks: 234<br />
Normal Version: -0.0251371 clocks: 282</p>
<p>STL Version: -0.0251371 clocks: 235<br />
Normal Version: -0.0251371 clocks: 281</p>
</blockquote>
<p>bei mir ist die &quot;handmade&quot; also bissl langsamer.<br />
habs einfach mit dem aktuellen dev-cpp und standard compiler-einstellungen kompiliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/886425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/886425</guid><dc:creator><![CDATA[chris&#x27; 1]]></dc:creator><pubDate>Thu, 06 Oct 2005 13:17:07 GMT</pubDate></item></channel></rss>