pi sample program w/ metaprogramming optimizations

Craig Black cblack at ara.com
Sat Apr 29 04:37:53 PDT 2006


I wanted to explore optimizing code in D so I spent a few hours optimizing
the pi.d sample program that comes with the dmd compiler.  I used some neat
metaprogramming tricks.  On my computer it is almost twice as fast as the
original version.

-Craig


begin 666 pi2.d
M#0II;7!O<G0@<W1D+F,N<W1D:6\[#0II;7!O<G0@<W1D+F,N<W1D;&EB.PT*
M:6UP;W)T('-T9"YC+G1I;64[#0H-"F-O;G-T(&EN="!,3TY'7U1)344]-# P
M,#L-"@T*8GET95M=(' [#0IB>71E6UT@=#L-"FEN="!Q.PT*#0II;G0@;6%I
M;BAC:&%R6UU;72!A<F=S*0T*>PT*"71I;65?="!S=&%R=&EM92P at 96YD=&EM
M93L-"@T*"6EF("AA<F=S+FQE;F=T:" ]/2 R*2![#0H)"7-S8V%N9B at F87)G
M<ULQ75LP72PB)60B+"9Q*3L-"@E](&5L<V4@>PT*"0EP<FEN=&8H(E5S86=E
M.B!P:2!;<')E8VES:6]N75QN(BD[#0H)"65X:70H-34I.PT*"7T-"@T*"6EF
M("AQ(#P@,"D-"@E[#0H)"7!R:6YT9B at B4')E8VES:6]N('=A<R!T;V\@;&]W
M+"!R=6YN:6YG('=I=&@@<')E8VES:6]N(&]F(# N7&XB*3L-"@D)<2 ](# [
M#0H)?0T*#0H):68@*'$@/B!,3TY'7U1)344I#0H)>PT*"2 @("!P<FEN=&8H
M(D)E('!R97!A<F5D('1O('=A:70 at 82!W:&EL92XN+EQN(BD[#0H)?0T*#0H)
M+R\@0V]M<'5T92!O;F4@;6]R92!D:6=I="!T:&%N('=E(&1I<W!L87D@=&\@
M8V]M<&5N<V%T92!F;W(@<F]U;F1I;F<-"@EQ*RL[#0H-"@EP+FQE;F=T:" ]
M('$@*R Q.PT*"70N;&5N9W1H(#T@<2 K(#$[#0H-"@DO+R!#;VUP=71E('!I
M#0H)<W1D+F,N=&EM92YT:6UE*"9S=&%R=&EM92D[#0H)87)C=&%N,B at I.PT*
M"6%R8W1A;C,H*3L-"@EM=6PT*"D[#0H)<W1D+F,N=&EM92YT:6UE*"9E;F1T
M:6UE*3L-"@T*"2\O(%)E='5R;B!T;R!T:&4@;G5M8F5R(&]F(&1I9VET<R!W
M92!W86YT('1O(&1I<W!L87D-"@EQ+2T[#0H-"@DO+R!0<FEN="!P:0T*"7!R
M:6YT9B at B<&D@/2 E9"XB+&-A<W0H:6YT*2AP6S!=*2D[#0H)9F]R("AI;G0@
M:2 ](#$[(&D@/#T@<3L@:2LK*0T*"0EP<FEN=&8H(B5D(BQC87-T*&EN="DH
M<%MI72DI.PT*"7!R:6YT9B at B7&XB*3L-"@EP<FEN=&8H(B5L9"!S96-O;F1S
M('1O(&-O;7!U=&4@<&D@=VET:"!A('!R96-I<VEO;B!O9B E9"!D:6=I=',N
M7&XB+&5N9'1I;64M<W1A<G1I;64L<2D[#0H-"@ER971U<FX@,#L-"GT-"@T*
M+RH at 5&5M<&QA=&4@=&AA="!D971E<FUI;F5S(&EF(&$@;G5M8F5R(&ES(&$@
M<&]W97(@;V8@#0H@*B R(&%T(&-O;7!I;&4@=&EM90T*("HO#0IT96UP;&%T
M92!I<U!O=S(H=6EN="!N*2![(&-O;G-T(&)O;VP@:7-0;W<R(#T@*&X@)2 R
M*2 A/2 P(#\@9F%L<V4 at .B!I<U!O=S(A*&X at +R R*3L@?0T*=&5M<&QA=&4@
M:7-0;W<R*'5I;G0@;B Z(# I('L at 8V]N<W0 at 8F]O;"!I<U!O=S(@/2!F86QS
M93L@?0T*=&5M<&QA=&4@:7-0;W<R*'5I;G0@;B Z(#$I('L at 8V]N<W0 at 8F]O
M;"!I<U!O=S(@/2!F86QS93L@?0T*=&5M<&QA=&4@:7-0;W<R*'5I;G0@;B Z
M(#(I('L at 8V]N<W0 at 8F]O;"!I<U!O=S(@/2!T<G5E.R!]#0H-"B\J(%5S92!A
M('1E;7!L871E('1O(&=E="!G;V]D(&-O;7!I;&4@=&EM92!O<'1I;6EZ871I
M;VYS(&9O<@T*("H at 9&EV:7-I;VX at 86YD(&UU;'1I<&QI8V%T:6]N( T*("HO
M#0IT96UP;&%T92!F87-T9&EV*&EN="!D:79I<V]R*0T*>PT*"79O:60 at 9F%S
M=&1I=B at I#0H)>PT*"0EI;G0@<CL at +R\@<F5M86EN9&5R#0H-"@D-"@D)9F]R
M("AI;G0@:2 ](# [(&D@/#T@<3L@:2LK*2![#0H)"0EI;G0 at 8B ]('1;:5T@
M*R!R("H@,3 [#0H)"0EI;G0@<2 ](&(@+R!D:79I<V]R.PT*"0D)<W1A=&EC
M(&EF*&ES4&]W,B$H9&EV:7-O<BDI( T*"0D)"7(@/2!B("4 at 9&EV:7-O<CL@
M+R\@8V]M<&EL97(@8V%N(&]P=&EM:7IE(&UO9'5L=7, at 9F]R('!O=V5R<R!O
M9B R#0H)"0EE;'-E( T*"0D)"7(@/2!B("T@<2 J(&1I=FES;W([#0H)"0ET
M6VE=(#T@<3L-"@D)?0T*"7T-"GT-"@T*+R\@0V]M<'5T97,@=&AE(&%R8W1A
M;F=E;G0@;V8@, at T*=F]I9"!A<F-T86XR*"D-"GL-"@EI;G0@;CL-"@T*"71;
M,%T@/2 Q.PT*"69A<W1D:78A*#(I.PT*"6%D9"@I.PT*"6X@/2 Q.PT*"61O
M('L-"@D);75L*&XI.PT*"0EF87-T9&EV(2 at T*3L-"@D)9&EV*&X@*ST@,BD[
M#0H)"6EF("@H*"AN+3$I("\@,BD@)2 R*2 ]/2 P*0T*"0D)861D*"D[#0H)
M"65L<V4-"@D)"7-U8B at I.PT*"7T@=VAI;&4@*"%T:7-Z97)O*"DI.PT*?0T*
M#0H-"B\O($-O;7!U=&5S('1H92!A<F-T86YG96YT(&]F(#,-"G9O:60 at 87)C
M=&%N,R at I#0I[#0H):6YT(&X[#0H-"@ET6S!=(#T@,3L-"@EF87-T9&EV(2 at S
M*3L-"@EA9&0H*3L-"@EN(#T@,3L-"@ED;R![#0H)"6UU;"AN*3L-"@D)9F%S
M=&1I=B$H.2D[#0H)"61I=BAN("L](#(I.PT*"0EI9B H*"@H;BTQ*2 O(#(I
M("4@,BD@/3T@,"D-"@D)"6%D9"@I.PT*"0EE;'-E#0H)"0ES=6(H*3L-"@E]
M('=H:6QE("@A=&ES>F5R;R at I*3L-"GT-"@T*=F]I9"!A9&0H*0T*>PT*#0H)
M9F]R("AI;G0@:B ]('$[(&H@/CT@,#L@:BTM*0T*"7L-"@D):68@*'1;:ET@
M*R!P6VI=(#X at .2D@>PT*"0D)<%MJ72 K/2!T6VI=("T@,3 [#0H)"0EP6VHM
M,5TK*SL-"@D)?2!E;'-E#0H)"0EP6VI=("L]('1;:ET[#0H)?0T*?0T*#0IV
M;VED('-U8B at I#0I[#0H)9F]R("AI;G0@:B ]('$[(&H@/CT@,#L@:BTM*0T*
M"0EI9B H<%MJ72 \('1;:ETI('L-"@D)"7!;:ET at +3T@=%MJ72 M(#$P.PT*
M"0D)<%MJ+3%=+2T[#0H)"7T at 96QS90T*"0D)<%MJ72 M/2!T6VI=.PT*?0T*
M#0H-"G9O:60@;75L*&EN="!M=6QT:7!L:65R*0T*>PT*"6EN="!C.PT*#0H-
M"@EF;W(@*&EN="!I(#T@<3L@:2 ^/2 P.R!I+2TI('L-"@D):6YT(&(@/2!T
M6VE=("H@;75L=&EP;&EE<B K(&,[#0H)"6,@/2!B("\@,3 [#0H)"71;:5T@
M/2!B("T at 8R J(#$P.R -"@E]#0I]#0H-"@T*=F]I9"!M=6PT*"D-"GL-"@EI
M;G0 at 8SL-"@T*"69O<B H:6YT(&D@/2!Q.R!I(#X](# [(&DM+2D@>PT*(" @
M(" @(" @(" @(" @(&EN="!B(#T@<%MI72 J(#0@*R!C.PT*(" @(" @(" @
M(" @(" @(&,@/2!B("\@,3 [#0H)"7!;:5T@/2!B("T at 8R J(#$P.R -"@E]
M#0I]#0H-"@T*=F]I9"!D:78H:6YT(&1I=FES;W(I#0I[#0H):6YT('([("\O
M(')E;6%I;F1E<@T*#0H@(" @(" @("\J($]P=&EM:7IA=&EO;CH at 270G<R!F
M87-T97(@=&\@9&\@9FQO871I;G0@<&]I;G0@;75L=&EP;&EC871I;VX@=&AA
M;@T*(" @(" @(" @*B!I;G1E9V5R(&1I=FES:6]N+B!4:&ES(&ES(&)E8V%U
M<V4@=&AE<F4@:7,@;F\@:6YT96=E<B!D:79I<VEO;B!I;G-T<G5C=&EO;BX-
M"B @(" @(" @("H at 56YD97(@=&AE(&AO;V0L(&EN=&5G97(@9&EV:7-I;VX@
M:7, at 97-S96YT:6%L;'D at 9FQO871I;F<M<&]I;G0 at 9&EV:7-I;VXN#0H@(" @
M(" @(" J+PT*(" @(" @("!D;W5B;&4@:61I=B ](#$N," O(&1I=FES;W([
M#0H-"@EF;W(@*&EN="!I(#T@,#L@:2 \/2!Q.R!I*RLI('L-"B @(" @(" @
M(" @(" @("!I;G0 at 8B ]('1;:5T@*R!R("H@,3 [( T*"0EI;G0@<75O=&EE
M;G0@/2!C87-T*&EN="DH8V%S="AD;W5B;&4I8B J(&ED:78I.PT*"0ER(#T@
M8B M('%U;W1I96YT("H at 9&EV:7-O<CL-"@D)=%MI72 ]('%U;W1I96YT.PT*
M"7T-"GT-"@T*:6YT('1I<WIE<F\H*0T*>PT*"69O<B H:6YT(&L@/2 P.R!K
M(#P]('$[(&LK*RD-"@D):68@*'1;:UT@(3T@,"D-"@D)"7)E='5R;B!F86QS
<93L-"@ER971U<FX@=')U93L-"GT-"@T*#0H-"@``
`
end




More information about the Digitalmars-d mailing list