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


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