ld flag that gives ~40% startup time boost
John Richard Moser
nigelenki at comcast.net
Thu Jun 22 20:51:12 BST 2006
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Does Ubuntu build everything with -Wl,-O1? This was something that
Gentoo did as an optimization; I just ran a cheap test and got about a
40% speed gain. I did a dpkg-buildpackage on coreutils and didn't see
any -Wl,-O1 stuff being passed anywhere (glancing through gcc
compilation and final linking commands), so I assume this isn't used.
This is part of standard binutils; I build tested the psychotic
link-to-everything-you-can-find hello program using ubuntu's standard
ld. :)
This should be good for making GNOME and OpenOffice.org load faster,
among other things. I was looking into -Bdirect as well but Drepper
doesn't like it so it's not in mainline binutils or glibc; this rather
effectively excludes it from being used in Ubuntu.
Gentoo bug on -Bdirect: http://bugs.gentoo.org/show_bug.cgi?id=114008
As for -Wl,-O1, I checked the sizes before and after stripping. In both
cases, the size was 10913 bytes before stripping, 6816 bytes after
stripping; in other words, there's no disk space gains or losses with
- -Wl,-O1 (unlike Prelink, which uses more space!).
I have not rebuilt the entire system with -Wl,-O1, and am not sure if
the effect is cascading; that is, I don't know if there is a larger than
40% gain that is being averaged down to 40% by the other libraries, such
as the following theoreticals:
ldtest - 60% gain
foo.so - 0% (not optimized)
bar.so - 0% (not optimized)
TOTAL: 20% gain
In other words, I think the gains MAY become more than 40% if you run
this on the whole system. I'm rather certain this is safe; I've forced
it on Gentoo without any problems. It should be a great target for Edgy.
CODE:
/* This is a simple hello world that links to everything in the universe*/
#include <stdio.h>
char *gh_eval_str = 0;
int main() {
printf("hello, world!\n");
return 0;
}
COMPILE:
bluefox at icebox:/tmp/x/ldtest$ gcc ldtest.c -o ldtest \
`for i in /usr/lib/lib*.a; do basename "$i"; done | \
sed -e "s/^lib/\-l/" | sed -e 's/\.a$//'`
WHAT'S IT LINKED TO:
bluefox at icebox:/tmp/x/ldtest$ ldd ldtest
linux-gate.so.1 => (0xffffe000)
libaa.so.1 => /usr/lib/libaa.so.1 (0xb7f88000)
libanl.so.1 => /lib/tls/i686/cmov/libanl.so.1 (0xb7f85000)
libart_lgpl_2.so.2 => /usr/lib/libart_lgpl_2.so.2 (0xb7f6f000)
libart_lgpl.so.2 => /usr/lib/libart_lgpl.so.2 (0xb7f60000)
libartsc.so.0 => /usr/lib/libartsc.so.0 (0xb7f5a000)
libasound.so.2 => /usr/lib/libasound.so.2 (0xb7ea5000)
libasprintf.so.0 => /usr/lib/libasprintf.so.0 (0xb7ea3000)
libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb7e8a000)
libaudio.so.2 => /usr/lib/libaudio.so.2 (0xb7e75000)
libaudiofile.so.0 => /usr/lib/libaudiofile.so.0 (0xb7e55000)
libBrokenLocale.so.1 => /lib/tls/i686/cmov/libBrokenLocale.so.1
(0xb7e53000)
libbz2.so.1.0 => /lib/libbz2.so.1.0 (0xb7e42000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d13000)
libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb7ccd000)
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7c9f000)
libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8
(0xb7b71000) libncurses.so.5 => /lib/libncurses.so.5 (0xb7b30000)
libdb3.so.3 => /usr/lib/libdb3.so.3 (0xb7a88000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7a85000)
libesd.so.0 => /usr/lib/libesd.so.0 (0xb7a7b000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb7a5b000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb7a2d000)
libform.so.5 => /usr/lib/libform.so.5 (0xb7a22000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb79b9000)
libgdict-1.0.so.1 => /usr/lib/libgdict-1.0.so.1 (0xb79a2000)
libgdk-1.2.so.0 => /usr/lib/libgdk-1.2.so.0 (0xb796c000)
libgdk_imlib.so.2 => /usr/lib/libgdk_imlib.so.2 (0xb7947000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0
(0xb7932000)
libgdk_pixbuf_xlib-2.0.so.0 =>
/usr/lib/libgdk_pixbuf_xlib-2.0.so.0 (0xb7923000)
libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb78a6000)
libgettextpo.so.0 => /usr/lib/libgettextpo.so.0 (0xb78a2000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb781e000)
libglib-1.2.so.0 => /usr/lib/libglib-1.2.so.0 (0xb77f9000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0xb7783000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb7780000)
libgmodule-1.2.so.0 => /usr/lib/libgmodule-1.2.so.0 (0xb777d000)
libgmp.so.3 => /usr/lib/libgmp.so.3 (0xb774d000)
libgmpxx.so.3 => /usr/lib/libgmpxx.so.3 (0xb7749000)
libgnome.so.32 => /usr/lib/libgnome.so.32 (0xb7730000)
libgnomesupport.so.0 => /usr/lib/libgnomesupport.so.0 (0xb772b000)
libgnomeui.so.32 => /usr/lib/libgnomeui.so.32 (0xb7656000)
libgnorba.so.27 => /usr/lib/libgnorba.so.27 (0xb764a000)
libgnorbagtk.so.0 => /usr/lib/libgnorbagtk.so.0 (0xb7643000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb760b000)
libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0xb7606000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb7602000)
libgthread-1.2.so.0 => /usr/lib/libgthread-1.2.so.0 (0xb75ff000)
libgtk-1.2.so.0 => /usr/lib/libgtk-1.2.so.0 (0xb74c4000)
libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb71ef000)
libguileopts.so.0 => /usr/lib/libguileopts.so.0 (0xb71ed000)
libhistory.so.5 => /lib/libhistory.so.5 (0xb71e5000)
libICE.so.6 => /usr/lib/libICE.so.6 (0xb71cd000)
libid3-3.8.so.3 => /usr/lib/libid3-3.8.so.3 (0xb7194000)
libIDL-0.6.so.0 => /usr/lib/libIDL-0.6.so.0 (0xb716e000)
libIIOP.so.0 => /usr/lib/libIIOP.so.0 (0xb7167000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xb7148000)
liblber.so.2 => /usr/lib/liblber.so.2 (0xb713b000)
libldap_r.so.2 => /usr/lib/libldap_r.so.2 (0xb7107000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb70e5000)
libmenu.so.5 => /usr/lib/libmenu.so.5 (0xb70de000)
libmp.so.3 => /usr/lib/libmp.so.3 (0xb70ca000)
libmpfr.so.1 => /usr/lib/libmpfr.so.1 (0xb709c000)
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7086000)
libogg.so.0 => /usr/lib/libogg.so.0 (0xb7081000)
libopts.so.25 => /usr/lib/libopts.so.25 (0xb706c000)
libORBit.so.0 => /usr/lib/libORBit.so.0 (0xb7030000)
libORBitCosNaming.so.0 => /usr/lib/libORBitCosNaming.so.0
(0xb7028000)
libORBitutil.so.0 => /usr/lib/libORBitutil.so.0 (0xb7026000)
libpanel.so.5 => /usr/lib/libpanel.so.5 (0xb7022000)
libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb6fea000)
libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0
(0xb6fe2000)
libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb6fbe000)
libpangox-1.0.so.0 => /usr/lib/libpangox-1.0.so.0 (0xb6fb3000)
libpangoxft-1.0.so.0 => /usr/lib/libpangoxft-1.0.so.0 (0xb6fad000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb6f89000)
libpopt.so.0 => /lib/libpopt.so.0 (0xb6f81000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb6f6f000)
libreadline.so.5 => /lib/libreadline.so.5 (0xb6f41000)
libresolv.so.2 => /lib/tls/i686/cmov/libresolv.so.2 (0xb6f2e000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb6f26000)
libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0xb6e9d000)
libslang.so.2 => /lib/libslang.so.2 (0xb6de2000)
libSM.so.6 => /usr/lib/libSM.so.6 (0xb6dda000)
libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb6d9d000)
libtiff.so.4 => /usr/lib/libtiff.so.4 (0xb6d4d000)
libtiffxx.so.0 => /usr/lib/libtiffxx.so.0 (0xb6d4a000)
libusb-0.1.so.4 => /lib/libusb-0.1.so.4 (0xb6d41000)
libutil.so.1 => /lib/tls/i686/cmov/libutil.so.1 (0xb6d3e000)
libwrap.so.0 => /lib/libwrap.so.0 (0xb6d37000)
libX11.so.6 => /usr/lib/libX11.so.6 (0xb6c51000)
libXau.so.6 => /usr/lib/libXau.so.6 (0xb6c4e000)
libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb6c45000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb6c41000)
libXext.so.6 => /usr/lib/libXext.so.6 (0xb6c34000)
libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb6c30000)
libXft.so.2 => /usr/lib/libXft.so.2 (0xb6c1e000)
libXi.so.6 => /usr/lib/libXi.so.6 (0xb6c16000)
libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb6c13000)
libxmms.so.1 => /usr/lib/libxmms.so.1 (0xb6c05000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb6c02000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb6bfa000)
libXt.so.6 => /usr/lib/libXt.so.6 (0xb6bac000)
libXtst.so.6 => /usr/lib/libXtst.so.6 (0xb6ba7000)
libXv.so.1 => /usr/lib/libXv.so.1 (0xb6ba3000)
libz.so.1 => /usr/lib/libz.so.1 (0xb6b8e000)
libgpm.so.1 => /usr/lib/libgpm.so.1 (0xb6b88000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6ab3000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6aa9000)
/lib/ld-linux.so.2 (0xb7fb5000)
liblaunchpad-integration.so.0 =>
/usr/lib/liblaunchpad-integration.so.0 (0xb6aa4000)
libgettextsrc-0.14.5.so => /usr/lib/libgettextsrc-0.14.5.so
(0xb6a76000) libgettextlib-0.14.5.so =>
/usr/lib/libgettextlib-0.14.5.so (0xb6a63000) libGL.so.1 =>
/usr/lib/libGL.so.1 (0xb69fd000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0xb69e8000)
libgnutls.so.12 => /usr/lib/libgnutls.so.12 (0xb697f000)
libXxf86vm.so.1 => /usr/lib/libXxf86vm.so.1 (0xb6979000)
libdrm.so.2 => /usr/lib/libdrm.so.2 (0xb6972000)
libtasn1.so.2 => /usr/lib/libtasn1.so.2 (0xb6962000)
libgcrypt.so.11 => /usr/lib/libgcrypt.so.11 (0xb6916000)
.... uh. Yeah that's a go.
PRELOAD INTO MEMORY:
bluefox at icebox:/tmp/x/ldtest$ ./ldtest
hello, world!
bluefox at icebox:/tmp/x/ldtest$ ./ldtest
hello, world!
TIME TEST:
bluefox at icebox:/tmp/x/ldtest$ time ./ldtest
hello, world!
real 0m0.236s
user 0m0.146s
sys 0m0.009s
bluefox at icebox:/tmp/x/ldtest$ time ./ldtest
hello, world!
real 0m0.228s
user 0m0.142s
sys 0m0.011s
bluefox at icebox:/tmp/x/ldtest$ time ./ldtest
hello, world!
real 0m0.229s
user 0m0.146s
sys 0m0.012s
Average: 0.231, 0.145, 0.011
RELINK:
bluefox at icebox:/tmp/x/ldtest$ gcc ldtest.c -Wl,-O1 -o ldtest \
`for i in /usr/lib/lib*.a; do basename "$i"; done | \
sed -e "s/^lib/\-l/" | sed -e 's/\.a$//'`
TIME AGAIN:
bluefox at icebox:/tmp/x/ldtest$ time ./ldtest hello, world!
real 0m0.115s
user 0m0.092s
sys 0m0.009s
bluefox at icebox:/tmp/x/ldtest$ time ./ldtest
hello, world!
real 0m0.155s
user 0m0.091s
sys 0m0.010s
bluefox at icebox:/tmp/x/ldtest$ time ./ldtest
hello, world!
real 0m0.156s
user 0m0.091s
sys 0m0.012s
Average: 0.142, 0.091, 0.011
COMPARE:
Without: 0.231, 0.145, 0.011
With: 0.142, 0.091, 0.011
Difference: 0.089, 0.054, 0.000
Percent: 38.5%, 37.2%, 0%
- --
All content of all messages exchanged herein are left in the
Public Domain, unless otherwise explicitly stated.
Creative brains are a valuable, limited resource. They shouldn't be
wasted on re-inventing the wheel when there are so many fascinating
new problems waiting out there.
-- Eric Steven Raymond
We will enslave their women, eat their children and rape their
cattle!
-- Bosc, Evil alien overlord from the fifth dimension
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iQIVAwUBRJr0qgs1xW0HCTEFAQKNKA//TgZIuvt/JAF157X7puZybMZSC6Ydy0Tx
cmGChY35tMEtEOhGnPgo0dWnqJ2gSil7hlhL6+6peV2dkEV3WPfjyWysIHCClrj0
UYUEZI5pX3yskRf1kOmc1IU9Q26gv3kwxL/rq5iS3TLzBo8BfKY3QHmdr0zBX8y4
jR3de3mvu2KO+sRJqm4ykFKCWNC8UKHn8NgSxzFtLyFhIqoHB7r3ZRiSZl7L5Cp7
btOplpc3hRUy/iUxHFVQjxcLpptVTi8iudndpmixL+wedEJeC3GECxog7G28ZVye
7wgPbG9g7E7Be5a1Abn5ubnOXgp644ZsYTI9eTLk0oPSGoSD80eWdsYU32jX47gX
Szp8TpbVwCRANBCHg+Y00pzdTsn+1frkyytaWNh4YesR7Khq0XV1I+PNwoJGWiAG
/LnE1rqWycAPwolchCr+sZttcocgnsyYUKYQs6Phfy9hJrGRiTYhcBOwvcMnzYOO
7jhxAiHPAr4D5C/5oaEpj0Rtc9IUx5YPfuZO3vnIN+Q98+qpAXYL1D2ylfK6cB/v
TTLC4lCBkQXGsVvtckZMNrHVnCwsY4XwotCVANQiqUutXpA2mPE7PR93Q+B1wPA9
APDecff+2qqb8fyS8lW3grWlveJOBrGlFGINR0IM9jKgUttAmRY0j45ILhqnO+rz
13PhG/tGJCM=
=dNgy
-----END PGP SIGNATURE-----
More information about the ubuntu-devel
mailing list