boost crowd.
Peter Alexander
peter.alexander.au at gmail.com
Tue Nov 29 01:46:18 PST 2011
On 29/11/11 2:12 AM, Marco Leise wrote:
> Am 28.11.2011, 14:42 Uhr, schrieb Maxim Fomin <maxim at maxim-fomin.ru>:
>
>> 2011/11/28 Marco Leise <Marco.Leise at gmx.de>:
>>> Am 28.11.2011, 11:02 Uhr, schrieb Jude <10equals2 at gmail.com>:
>>>
>>>>> I tried to write a lib and a project, which used that lib
>>>>> separately, but came to conclusion that the best choice it to pull
>>>>> lib code to project one. And it is not a biggest problem, because
>>>>> dmd produces 700 kb executable for hello word program.
>>>>
>>>> what..?
>>>>
>>>> I don't know how you are managing to get 700kb for hello world...
>>>> mine clocks in a 283.7kb with dmd with no optmizations, and holy crap
>>>> 1.6MB for same file with gdmd.
>>>>
>>>> WTF is going on there I wonder...?
>>>
>>> *drum roll*
>>>
>>> 148,2 kB (dmd 2.054, Linux)
>>>
>>> *tadaa*
>>>
>>> - 8< - - - - - - - - - - - - - - - - - - -
>>> import std.stdio;
>>>
>>> void main() {
>>> writeln("Hello, world!");
>>> }
>>> - 8< - - - - - - - - - - - - - - - - - - -
>>>
>>
>> ------
>> import std.stdio;
>>
>> class dummy
>> {
>> this() { writeln("ctor");}
>> ~this() { writeln("dtor"); }
>> }
>>
>> void main()
>> {
>> auto dm = new dummy();
>> }
>> -------
>>
>> dmd main.d -o
>> 377,9 kb
>> It is not 700 as i told, but yesterday i upgraded to 2.056. But
>> definitely i saw that it produces 700 kb elf for a small program.
>> Anyway, is 400 kb for dummy program too much?
>
> Be aware that classes and structs have .init blocks that can grow huge
> if you declare large static arrays in them. So the source code may be
> small, but the executable bloats. And every template instantiation adds
> to it as well. I think even just using writeln with different parameters
> all over the place adds up, but thats a vague guess.
A couple of other things I noticed that can massively bloat your code
using DMD:
Range case statements:
switch(c)
{
case 0: .. case 255:
foo();
break;
}
Expands to
if(c == 0) goto L1;
if(c == 1) goto L1;
if(c == 2) goto L1;
...
if(c == 255) goto L1;
etc.
Which means you also get a horrible O(n) algorithm for something that
should be a couple of compares. Why DMD does this is beyond me. There's
a few function in Phobos that are massively bloated due to this (I've
filed a bug report before anyone asks).
----
Global float arrays can bloat executables as well:
__gshared int[1_000_000] thisGoesInBss; // barely adds anything
__gshared float[1_000_000] thisGoesInData; // adds 4MB to exec
float arrays are initialised to NaN in D (in C they init to 0.0f), so
they can't go in the .bss section (unless you explicitly init to 0.0f).
More information about the Digitalmars-d
mailing list