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