Creeping Bloat in Phobos
Walter Bright via Digitalmars-d
digitalmars-d at puremagic.com
Sat Sep 27 13:57:58 PDT 2014
From time to time, I take a break from bugs and enhancements and just look at
what some piece of code is actually doing. Sometimes, I'm appalled. Phobos, for
example, should be a lean and mean fighting machine:
http://www.nbcnews.com/id/38545625/ns/technology_and_science-science/t/king-tuts-chariots-were-formula-one-cars/#.VCceNmd0xjs
Instead, we have something more akin to:
http://untappedcities.com/2012/10/31/roulez-carrosses-carriages-of-versailles-arrive-in-arras/
More specifically, I looked at std.file.copy():
https://github.com/D-Programming-Language/phobos/blob/master/std/file.d
Which is 3 lines of code:
void copy(in char[] from, in char[] to) {
immutable result = CopyFileW(from.tempCStringW(), to.tempCStringW(),
false);
if (!result)
throw new FileException(to.idup);
}
Compiling this code for Windows produces the rather awful:
_D3std4file4copyFxAaxAaZv comdat
assume CS:_D3std4file4copyFxAaxAaZv
L0: push EBP
mov EBP,ESP
mov EDX,FS:__except_list
push 0FFFFFFFFh
lea EAX,-0220h[EBP]
push offset _D3std4file4copyFxAaxAaZv[0106h]
push EDX
mov FS:__except_list,ESP
sub ESP,8
sub ESP,041Ch
push 0
push dword ptr 0Ch[EBP]
push dword ptr 8[EBP]
call near ptr
_D3std8internal7cstring21__T11tempCSÇàÆTuTaZÇìÆFNbNixAaZSÇ┬├3Res
mov dword ptr -4[EBP],0
lea EAX,-0220h[EBP]
call near ptr
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res3ptrMxFNaNbNdNiNfZPxu
push EAX
lea EAX,-0430h[EBP]
push dword ptr 014h[EBP]
push dword ptr 010h[EBP]
call near ptr
_D3std8internal7cstring21__T11tempCSÇàÆTuTaZÇìÆFNbNixAaZSÇ┬├3Res
mov dword ptr -4[EBP],1
lea EAX,-0430h[EBP]
call near ptr
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res3ptrMxFNaNbNdNiNfZPxu
push EAX
call dword ptr __imp__CopyFileW at 12
mov -01Ch[EBP],EAX
mov dword ptr -4[EBP],0
call near ptr L83
jmp short L8F
L83: lea EAX,-0220h[EBP]
call near ptr
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res6__dtorMFNbNiZv
ret
L8F: mov dword ptr -4[EBP],0FFFFFFFFh
call near ptr L9D
jmp short LA9
L9D: lea EAX,-0430h[EBP]
call near ptr
_D3std8internal7cstring21__T11tempCStringTuTaZ11tempCStringFNbNixAaZ3Res6__dtorMFNbNiZv
ret
LA9: cmp dword ptr -01Ch[EBP],0
jne LF3
mov ECX,offset FLAT:_D3std4file13FileException7__ClassZ
push ECX
call near ptr __d_newclass
add ESP,4
push dword ptr 0Ch[EBP]
mov -018h[EBP],EAX
push dword ptr 8[EBP]
call near ptr _D6object12__T4idupTxaZ4idupFNaNbNdNfAxaZAya
push EDX
push EAX
call dword ptr __imp__GetLastError at 0
push EAX
push dword ptr _D3std4file13FileException6__vtblZ[02Ch]
push dword ptr _D3std4file13FileException6__vtblZ[028h]
push 095Dh
mov EAX,-018h[EBP]
call near ptr
_D3std4file13FileException6__ctorMFNfxAakAyakZC3std4file13FileException
push EAX
call near ptr __d_throwc
LF3: mov ECX,-0Ch[EBP]
mov FS:__except_list,ECX
mov ESP,EBP
pop EBP
ret 010h
mov EAX,offset FLAT:_D3std4file13FileException6__vtblZ[0310h]
jmp near ptr __d_framehandler
which is TWICE as much generated code as for D1's copy(), which does the same
thing. No, it is not because D2's compiler sux. It's because it has become
encrustified with gee-gaws, jewels, decorations, and other crap.
To scrape the barnacles off, I've filed:
https://issues.dlang.org/show_bug.cgi?id=13541
https://issues.dlang.org/show_bug.cgi?id=13542
https://issues.dlang.org/show_bug.cgi?id=13543
https://issues.dlang.org/show_bug.cgi?id=13544
I'm sure there's much more in std.file (and elsewhere) that can be done. Guys,
when developing Phobos/Druntime code, please look at the assembler once in a
while and see what is being wrought. You may be appalled, too.
More information about the Digitalmars-d
mailing list