[ 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.