28-Sep-2014 00:57, Walter Bright пишет:
 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:

In all honesty - 2 RAII structs w/o inlining + setting up exception frame + creating and allocating an exception + idup-ing a string does account to about this much.



_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@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@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.





--
Dmitry Olshansky

Reply via email to