[Libreoffice] message construction bloat ...
Michael Meeks
michael.meeks at suse.com
Wed Nov 23 04:59:00 PST 2011
So,
While the discussion on logging goes on; I knocked up a little test to
compare the difference between a couple of styles of string creation,
orthogonally for eg. exception message construction.
One of LibreOffice's -big- problems is size: we're too big. There are
lots of reasons for that, but little bits of bloat everywhere would be a
major cause of that.
The attached test contrasts:
fprintf (stderr, "P is %s and b is %d\n", p, b);
vs.
std::cout << "P is " << p << " and b is " << b << "\n";
Discarding the extra symbols + plt entries, ioinit & destruction, extra
string termination overhead from fragmented strings etc. and just
looking at the size of complete compiled 'main' .text
I get 61 bytes vs. 102 bytes in favour of fprintf.
Given that the real per-site difference is larger. Add to this the
issue that there are real translation problems with the 2nd approach
(that it cannot be appropriately re-ordered), and IMHO the argument here
is overwhelmingly against 'cute' operator-overloading approaches - where
each 'little' operator turns into a chunky function call at compile
time. Clearly if we introduce operators / allocations that can throw -
we also end up with some chunky eh_frame / exception unwind tables too.
If we can choose a way of constructing message, IMHO it should not be
one that has this problem; concatenation by '+' operator shares this of
course.
I know C++ doesn't like var-args, and I know var-args is type-unsafe,
and thus per-se 'evil' :-) but it also happens to be really easy to use
& read, better to translate, very familiar to most developers, and ...
Anyhow - just to throw some data at the problem.
ATB,
Michael.
--
michael.meeks at suse.com <><, Pseudo Engineer, itinerant idiot
-------------- next part --------------
A non-text attachment was scrubbed...
Name: a.cxx
Type: text/x-c++src
Size: 426 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20111123/a382e075/attachment.cxx>
-------------- next part --------------
.file "a.cxx"
.section .rodata.str1.1,"aMS", at progbits,1
.LC0:
.string "foo"
.LC1:
.string "P is %s and b is %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0x0
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x7c,0x6
subl $20, %esp
movl $42, -12(%ebp)
movl -12(%ebp), %eax
pushl %eax
pushl $.LC0
pushl $.LC1
pushl stderr
.cfi_escape 0x2e,0x10
call fprintf
movl -4(%ebp), %ecx
.cfi_def_cfa 1, 0
movl $1, %eax
leave
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]"
.section .comment.SUSE.OPTs,"MS", at progbits,1
.string "OSpwg"
.section .note.GNU-stack,"", at progbits
-------------- next part --------------
.file "a.cxx"
.section .rodata.str1.1,"aMS", at progbits,1
.LC0:
.string "P is "
.LC1:
.string " and b is "
.LC2:
.string "\n"
.text
.globl main
.type main, @function
main:
.LFB1026:
.cfi_startproc
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0x0
pushl %ebx
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x78,0x6
subl $24, %esp
pushl $.LC0
pushl $_ZSt4cout
movl $42, -12(%ebp)
movl -12(%ebp), %ebx
.cfi_escape 0x10,0x3,0x2,0x75,0x7c
.cfi_escape 0x2e,0x10
call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
popl %edx
popl %ecx
pushl $1
pushl %eax
call _ZNSo9_M_insertIbEERSoT_
popl %edx
popl %ecx
pushl $.LC1
pushl %eax
call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
popl %edx
popl %ecx
pushl %ebx
pushl %eax
call _ZNSolsEi
popl %edx
popl %ecx
pushl $.LC2
pushl %eax
call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
leal -8(%ebp), %esp
movl $1, %eax
popl %ecx
.cfi_def_cfa 1, 0
popl %ebx
.cfi_restore 3
popl %ebp
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_def_cfa 4, -4
.cfi_endproc
.LFE1026:
.size main, .-main
.type _GLOBAL__I_main, @function
_GLOBAL__I_main:
.LFB1032:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
subl $20, %esp
pushl $_ZStL8__ioinit
.cfi_escape 0x2e,0x10
call _ZNSt8ios_base4InitC1Ev
addl $12, %esp
pushl $__dso_handle
pushl $_ZStL8__ioinit
pushl $_ZNSt8ios_base4InitD1Ev
call __cxa_atexit
addl $16, %esp
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_def_cfa_offset -8
.cfi_endproc
.LFE1032:
.size _GLOBAL__I_main, .-_GLOBAL__I_main
.section .ctors,"aw", at progbits
.align 4
.long _GLOBAL__I_main
.local _ZStL8__ioinit
.comm _ZStL8__ioinit,1,1
.weakref _ZL20__gthrw_pthread_oncePiPFvvE,pthread_once
.weakref _ZL27__gthrw_pthread_getspecificj,pthread_getspecific
.weakref _ZL27__gthrw_pthread_setspecificjPKv,pthread_setspecific
.weakref _ZL22__gthrw_pthread_createPmPK14pthread_attr_tPFPvS3_ES3_,pthread_create
.weakref _ZL20__gthrw_pthread_joinmPPv,pthread_join
.weakref _ZL21__gthrw_pthread_equalmm,pthread_equal
.weakref _ZL20__gthrw_pthread_selfv,pthread_self
.weakref _ZL22__gthrw_pthread_detachm,pthread_detach
.weakref _ZL22__gthrw_pthread_cancelm,pthread_cancel
.weakref _ZL19__gthrw_sched_yieldv,sched_yield
.weakref _ZL26__gthrw_pthread_mutex_lockP15pthread_mutex_t,pthread_mutex_lock
.weakref _ZL29__gthrw_pthread_mutex_trylockP15pthread_mutex_t,pthread_mutex_trylock
.weakref _ZL31__gthrw_pthread_mutex_timedlockP15pthread_mutex_tPK8timespec,pthread_mutex_timedlock
.weakref _ZL28__gthrw_pthread_mutex_unlockP15pthread_mutex_t,pthread_mutex_unlock
.weakref _ZL26__gthrw_pthread_mutex_initP15pthread_mutex_tPK19pthread_mutexattr_t,pthread_mutex_init
.weakref _ZL29__gthrw_pthread_mutex_destroyP15pthread_mutex_t,pthread_mutex_destroy
.weakref _ZL30__gthrw_pthread_cond_broadcastP14pthread_cond_t,pthread_cond_broadcast
.weakref _ZL27__gthrw_pthread_cond_signalP14pthread_cond_t,pthread_cond_signal
.weakref _ZL25__gthrw_pthread_cond_waitP14pthread_cond_tP15pthread_mutex_t,pthread_cond_wait
.weakref _ZL30__gthrw_pthread_cond_timedwaitP14pthread_cond_tP15pthread_mutex_tPK8timespec,pthread_cond_timedwait
.weakref _ZL28__gthrw_pthread_cond_destroyP14pthread_cond_t,pthread_cond_destroy
.weakref _ZL26__gthrw_pthread_key_createPjPFvPvE,pthread_key_create
.weakref _ZL26__gthrw_pthread_key_deletej,pthread_key_delete
.weakref _ZL30__gthrw_pthread_mutexattr_initP19pthread_mutexattr_t,pthread_mutexattr_init
.weakref _ZL33__gthrw_pthread_mutexattr_settypeP19pthread_mutexattr_ti,pthread_mutexattr_settype
.weakref _ZL33__gthrw_pthread_mutexattr_destroyP19pthread_mutexattr_t,pthread_mutexattr_destroy
.ident "GCC: (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]"
.section .comment.SUSE.OPTs,"MS", at progbits,1
.string "OSpwg"
.section .note.GNU-stack,"", at progbits
More information about the LibreOffice
mailing list