[Scummvm-devel] Code size
Max Horn
max at quendi.de
Thu Oct 16 19:28:17 CEST 2008
Hi folks
we recently talked about the size of a scummvm executable and how it
grew with the merger of the GUI branch. I guess that is partially due
to the fact that we now have an XML parser, too... ;) But I figured it
might be helpful to generate some more data to figure out where we
might be able to gain the most.
What I did was to compile a "release" binary for both trunk and the
0.12.0 branch. So I run
configure --enable-Werror --enable-release [ lots of --enable-
ENGINE statements ]
and made fresh builds for both, on an Apple MacBook Pro, with Apple's
modified GCC 4.0.1. Our "--enable-release" switch ensures that -O2 is
passed to the compiler.
I then sorted all *.o files by size of their TEXT segment. Since
engine code and infrastructure are kind of separate, I did this
separately independently on both. (I took the liberty of re-inserting
the column headers below for readability)
TRUNK rev 34812, non-engine code:
$ size */*.a | sort -nr | head
__TEXT __DATA __OBJC others dec hex
87543 1180 0 0 88723 15a93 graphics/libgraphics.a(hq3x_i386.o)
65445 1204 0 0 66649 10459 graphics/libgraphics.a(hq2x_i386.o)
65016 1072 0 566 66654 1045e gui/libgui.a(ThemeEngine.o)
54833 144 0 607 55584 d920 gui/libgui.a(ThemeParser.o)
46803 552 0 844 48199 bc47 gui/libgui.a(launcher.o)
46585 424 0 71 47080 b7e8 graphics/libgraphics.a(VectorRendererSpec.o)
39371 36 0 364 39771 9b5b base/libbase.a(commandLine.o)
32745 308 0 405 33458 82b2 gui/libgui.a(options.o)
28307 1700 0 354 30361 7699 sound/libsound.a(audiostream.o)
22409 140 0 536 23085 5a2d common/libcommon.a(advancedDetector.o)
$ ll -S */*.a
-rw-r--r-- 1 mhorn staff 736892 16. Okt 18:56 gui/libgui.a
-rw-r--r-- 1 mhorn staff 607148 16. Okt 18:56 graphics/libgraphics.a
-rw-r--r-- 1 mhorn staff 419884 16. Okt 18:56 sound/libsound.a
-rw-r--r-- 1 mhorn staff 365740 16. Okt 18:56 common/libcommon.a
-rw-r--r-- 1 mhorn staff 133636 16. Okt 18:56 backends/libbackends.a
-rw-r--r-- 1 mhorn staff 110956 16. Okt 18:56 base/libbase.a
-rw-r--r-- 1 mhorn staff 45876 16. Okt 18:56 engines/libengines.a
0.12.x BRANCH , non-engine code:
$ size */*.a | sort -nr | head
__TEXT __DATA __OBJC others dec hex
87543 1180 0 0 88723 15a93 graphics/libgraphics.a(hq3x_i386.o)
65445 1204 0 0 66649 10459 graphics/libgraphics.a(hq2x_i386.o)
51949 160 0 370 52479 ccff gui/libgui.a(ThemeModern.o)
38997 36 0 374 39407 99ef base/libbase.a(commandLine.o)
32101 424 0 710 33235 81d3 gui/libgui.a(launcher.o)
29182 296 0 341 29819 747b gui/libgui.a(options.o)
28307 1700 0 354 30361 7699 sound/libsound.a(audiostream.o)
27710 84 0 269 28063 6d9f gui/libgui.a(theme-config.o)
22040 120 0 462 22622 585e common/libcommon.a(advancedDetector.o)
20945 160 0 249 21354 536a gui/libgui.a(ThemeClassic.o)
$ ll -S */*.a
-rw-r--r-- 1 mhorn staff 594716 16. Okt 19:16 gui/libgui.a
-rw-r--r-- 1 mhorn staff 524604 16. Okt 19:16 graphics/libgraphics.a
-rw-r--r-- 1 mhorn staff 416684 16. Okt 19:16 sound/libsound.a
-rw-r--r-- 1 mhorn staff 267020 16. Okt 19:16 common/libcommon.a
-rw-r--r-- 1 mhorn staff 146228 16. Okt 19:16 backends/libbackends.a
-rw-r--r-- 1 mhorn staff 118244 16. Okt 19:16 base/libbase.a
-rw-r--r-- 1 mhorn staff 8608 16. Okt 19:16 engines/libengines.a
So, the HQx scalers are big, but they are desktop-only, so no problem.
But then, a very sizable chunk is taken by the new GUI code. The old
code was not tiny either, but it's clear that libgui.a and
libgraphis.a grew considerably (also libcommon.a grew, partially due
to the XML parser, but other changes are in there as well). It sure
would be nice to get those number back down a bit...
However, take all these numbers with a big grain of salt: We use lots
of template code these days, and that causes the compiler to generate
certain chunks of code multiple times, put into each *.o file
separately. Only during linking time are these duplicates resolved and
removed. So, the actual contribution of those *.o files to the
resulting binary might be a lot less than what is listed above.
On the other hand, this immediately hints at a potential way to save
memory: By carefully reconsidering how we use templates; esp. for the
container classes, we might be able to save some KB of duplicate code
(duplicate because the compiler generates it anew for each e.g.
HashMap variant, even though the code each time is almost or
completely identical). There are some ways to reduce that. If anybody
is interested in looking into that, talk to me.
Here's what I got for engines (I enabled all engines):
TRUNK rev 34812, non-engine code:
$ size engines/*/*.a | sort -nr | head
__TEXT __DATA __OBJC others dec hex
98802 2924 0 546 102272 18f80 engines/kyra/libkyra.a(staticres.o)
77058 64 0 553 77675 12f6b engines/lure/liblure.a(hotspots.o)
55721 244 0 351 56316 dbfc engines/touche/libtouche.a(touche.o)
54580 2112 0 333 57025 dec1 engines/kyra/libkyra.a(sound_towns.o)
53776 29904 0 613 84293 14945 engines/scumm/libscumm.a(detection.o)
51834 48 0 532 52414 ccbe engines/kyra/libkyra.a(script_lok.o)
51821 44 0 346 52211 cbf3 engines/igor/libigor.a(igor.o)
51025 96 0 719 51840 ca80 engines/kyra/libkyra.a(script_hof.o)
50265 0 0 320 50585 c599 engines/drascula/libdrascula.a(animation.o)
48901 256 0 509 49666 c202 engines/drascula/libdrascula.a(rooms.o)
To put this into perspective, here's the size of the lib*.a files for
each engine (to be taken with even more grains of salt, of course, but
they give a good rough indication anyway):
$ ll -S engines/*/*.a
-rw-r--r-- 1 mhorn staff 2661204 16. Okt 18:51 engines/scumm/libscumm.a
-rw-r--r-- 1 mhorn staff 1960012 16. Okt 18:53 engines/kyra/libkyra.a
-rw-r--r-- 1 mhorn staff 1027996 16. Okt 18:52 engines/gob/libgob.a
-rw-r--r-- 1 mhorn staff 877820 16. Okt 18:54 engines/parallaction/
libparallaction.a
-rw-r--r-- 1 mhorn staff 823140 16. Okt 18:51 engines/agos/libagos.a
-rw-r--r-- 1 mhorn staff 740188 16. Okt 18:55 engines/saga/libsaga.a
[...]
-rw-r--r-- 1 mhorn staff 238412 16. Okt 18:54 engines/made/libmade.a
0.12.x BRANCH , non-engine code:
$ size engines/*/*.a | sort -nr | head
92384 3040 0 531 95955 176d3 engines/kyra/libkyra.a(staticres.o)
77074 64 0 553 77691 12f7b engines/lure/liblure.a(hotspots.o)
57233 0 0 345 57578 e0ea engines/drascula/libdrascula.a(animation.o)
55273 236 0 341 55850 da2a engines/touche/libtouche.a(touche.o)
54956 2368 0 353 57677 e14d engines/kyra/libkyra.a(sound_towns.o)
51882 48 0 532 52462 ccee engines/kyra/libkyra.a(script_lok.o)
51854 36 0 346 52236 cc0c engines/igor/libigor.a(igor.o)
51487 29832 0 558 81877 13fd5 engines/scumm/libscumm.a(detection.o)
50993 96 0 719 51808 ca60 engines/kyra/libkyra.a(script_hof.o)
49606 40 0 554 50200 c418 engines/drascula/libdrascula.a(rooms.o)
$ ll -S engines/*/*.a
-rw-r--r-- 1 mhorn staff 2690660 16. Okt 19:16 engines/scumm/libscumm.a
-rw-r--r-- 1 mhorn staff 1861188 16. Okt 19:16 engines/kyra/libkyra.a
-rw-r--r-- 1 mhorn staff 948060 16. Okt 19:16 engines/gob/libgob.a
-rw-r--r-- 1 mhorn staff 803404 16. Okt 19:16 engines/agos/libagos.a
-rw-r--r-- 1 mhorn staff 711500 16. Okt 19:16 engines/saga/libsaga.a
-rw-r--r-- 1 mhorn staff 696756 16. Okt 19:16 engines/parallaction/
libparallaction.a
[...]
-rw-r--r-- 1 mhorn staff 232492 16. Okt 19:16 engines/made/libmade.a
So it seems most engines got a bit bigger, somehow... This might be
due to changes to our templated code in common, not sure yet.
Cheers,
Max
More information about the Scummvm-devel
mailing list