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

Martin Sebor commented on STDCXX-491:
-------------------------------------

Here are the timings for gcc on the same machine for comparison. Interesting 
that the gcc-generated code is faster than Intel's own (although we're still 
more than 30% faster)... 

$ gcc --version && g++ -m64 -O2 -D_REENTRANT -pthread t.cpp && time ./a.out 
0xffffffff
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

real    0m48.376s
user    0m45.259s
sys     0m3.104s


> string::push_back() slow
> ------------------------
>
>                 Key: STDCXX-491
>                 URL: https://issues.apache.org/jira/browse/STDCXX-491
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 21. Strings
>    Affects Versions: 4.1.3
>         Environment: gcc 4.1.2, Linux/x86_64
>            Reporter: Mark Brown
>            Assignee: Martin Sebor
>             Fix For: 4.2
>
>
> According to my timings string::push_back() in stdcxx 4.1.3 is more than 
> twice as slow than the same function in gcc 4.1.2 on Linux x86_64:
> $ time ./push_back-stdcxx 100000000
> real    0m2.175s
> user    0m2.004s
> sys     0m0.172s
> $ time ./push_back-gcc 100000000
> real    0m0.924s
> user    0m0.760s
> sys     0m0.164s
> #include <cassert>
> #include <cstdlib>
> #include <string>
> int main (int argc, char *argv[])
> {
>     const int N = argc < 2 ? 1 : std::atoi (argv [1]);
>     std::string str;
>     for (int i = 0; i < N; ++i)
>         str.push_back ('x');
>     assert (str.size () == std::size_t (N));
> }
> Comparing the generated assembly, the gcc push_back() is mostly inline but 
> the stdcxx push_back() is not:
> stdcxx:
> _Z8pushbackRSsc:
> .LFB449:
>       movq    (%rdi), %rax
>       movl    %esi, %edx
>       movl    $1, %ecx
>       movsbl  %dl,%r8d
>       xorl    %edx, %edx
>       movq    -8(%rax), %rsi
>       jmp     _ZNSs7replaceEmmmc
> gcc:
> _Z8pushbackRSsc:
> .LFB904:
>       movq    %rbp, -16(%rsp)
> .LCFI0:
>       movq    %r12, -8(%rsp)
> .LCFI1:
>       movq    %rdi, %rbp
>       movq    %rbx, -24(%rsp)
> .LCFI2:
>       subq    $24, %rsp
> .LCFI3:
>       movq    (%rdi), %rax
>       movl    %esi, %r12d
>       subq    $24, %rax
>       movq    (%rax), %rbx
>       addq    $1, %rbx
>       cmpq    8(%rax), %rbx
>       ja      .L2
>       movl    16(%rax), %eax
>       testl   %eax, %eax
>       jg      .L2
> .L4:
>       movq    (%rbp), %rdx
>       movq    -24(%rdx), %rax
>       movb    %r12b, (%rdx,%rax)
>       movq    (%rbp), %rax
>       subq    $24, %rax
>       movl    $0, 16(%rax)
>       movq    %rbx, (%rax)
>       movb    $0, 24(%rax,%rbx)
>       movq    (%rsp), %rbx
>       movq    8(%rsp), %rbp
>       movq    16(%rsp), %r12
>       addq    $24, %rsp
>       ret
>       .p2align 4,,7
> .L2:
>       movq    %rbx, %rsi
>       movq    %rbp, %rdi
>       call    _ZNSs7reserveEm
>       jmp     .L4

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