You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stdcxx.apache.org by "Martin Sebor (JIRA)" <ji...@apache.org> on 2007/08/06 05:25:59 UTC

[jira] Reopened: (STDCXX-491) string::push_back() slow

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

Martin Sebor reopened STDCXX-491:
---------------------------------


Reopened to attach file.

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