[ 
https://issues.apache.org/jira/browse/STDCXX-518?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12519279
 ] 

Mark Brown commented on STDCXX-518:
-----------------------------------

I thought timings for multipled threads might be of interest. Unfortunately, I 
have only 2 CPUs to test on.

$ time ./string-copy.gcc 100000000

real    0m9.739s
user    0m19.257s
sys     0m0.060s
$ time ./string-copy.stlport 100000000

real    0m20.906s
user    0m40.211s
sys     0m0.056s
$ time LD_LIBRARY_PATH=../lib ./string-copy 100000000

real    0m17.585s
user    0m34.698s
sys     0m0.076s



#include <cassert>
#include <cstdlib>
#include <string>
#include <pthread.h>


std::string strings [256];
const std::size_t num_strings = sizeof strings / sizeof *strings;
unsigned long n;

extern "C" void* test_copy_ctor (void*)
{
    for (unsigned long i = 0; i != n; ++i) {
        const std::size_t index = i % num_strings;
        const std::string copy (strings [index]);
        assert (copy.length () == index);
    }

    return 0;
}

int main (int argc, char *argv[])
{
    n = argc < 2 ? 0 : std::strtoul (argv [1], 0, 10);

    for (unsigned long i = 0; i != num_strings; ++i)
        strings [i].assign (i, 'x');

    pthread_t thread [2];
    const std::size_t num_threads = sizeof thread / sizeof *thread;

    for (std::size_t i = 0; i < num_threads; ++i)
        pthread_create (thread + i, 0, test_copy_ctor, 0);

    for (std::size_t i = 0; i < num_threads; ++i)
        pthread_join (thread [i], 0);
}


> std::string copy constructor slow
> ---------------------------------
>
>                 Key: STDCXX-518
>                 URL: https://issues.apache.org/jira/browse/STDCXX-518
>             Project: C++ Standard Library
>          Issue Type: Improvement
>          Components: 21. Strings
>    Affects Versions: 4.1.3
>         Environment: gcc 4.1.2, x86_64
>            Reporter: Mark Brown
>
> When thread safety is enabled in stdcxx the string copy constructor is more 
> than ten times slower than when it's not, and twice as slow as the same copy 
> constructor in gcc 4.1.2 on Linux (x86_64), but slightly faster than with 
> STLport 5.1.3. The timings were done on Intel x86_64 at 2.4GHz:
> BUILDMODE=shared,optimized:
> $ time LD_LIBRARY_PATH=../lib ./string-copy 100000000
> real    0m0.482s
> user    0m0.480s
> sys     0m0.000s
> BUILDMODE=shared,optimized,pthread:
> $ time LD_LIBRARY_PATH=../lib ./string-copy 100000000
> real    0m10.157s
> user    0m10.041s
> sys     0m0.032s
> gcc 4.1.2 with -O2 -m64:
> $ time ./string-copy.gcc 100000000
> real    0m4.280s
> user    0m4.260s
> sys     0m0.020s
> gcc 4.1.2 with STLport 5.1.3 (-D_REENTRANT -O2 -m64 -lpthread):
> $ time ./string-copy.stlport 100000000
> real    0m12.479s
> user    0m12.473s
> sys     0m0.004s
> #include <cassert>
> #include <cstdlib>
> #include <string>
> int main (int argc, char *argv[])
> {
>     const unsigned long n = argc < 2 ? 0 : std::strtoul (argv [1], 0, 10);
>     std::string strings [256];
>     const std::size_t num_strings = sizeof strings / sizeof *strings;
>     for (unsigned long i = 0; i != num_strings; ++i)
>         strings [i].assign (i, 'x');
>     for (unsigned long i = 0; i < n; ++i) {
>         const std::size_t length = i % num_strings;
>         const std::string str (strings [length]);
>         assert (str.size () == length);
>     }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to