{-# OPTIONS_GHC -freduction-depth=0 #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE DataKinds #-} module Main where import Html import qualified Blaze as BL import qualified ExampleBlaze as BL import qualified Small as S import qualified Medium as M import qualified ExampleTypeOfHtml as ET import Data.Word import Criterion.Main import Data.String import System.Random import System.IO.Unsafe import Data.Proxy import Text.Blaze.Html.Renderer.Utf8 import qualified Data.Text.Lazy as LT import qualified Data.Text as T import Data.ByteString.Lazy (foldl1') main :: IO () main = defaultMain [ small , string , comparison , scaling ] small :: Benchmark small = bgroup "Small" [ bench "oneElement" $ nf (run . S.oneElement) "" , bench "nestedElement" $ nf (run . S.nestedElement) "" , bench "parallelElement" $ nf (run . S.parallelElement) "" , bench "listElement" $ nf (run . S.listElement) "" , bench "Int" $ nf run (123456789 :: Int) , bench "Integer" $ nf run (123456789 :: Integer) , bench "Double" $ nf run (123456789 :: Double) , bench "Float" $ nf run (123456789 :: Float) , bench "Word" $ nf run (123456789 :: Word) , bench "Proxy" $ nf run (Proxy :: Proxy "abc") , bench "Char" $ nf run 'a' , bench "oneElement Proxy" $ nf (run . S.oneElement) (Proxy :: Proxy "abc") , bench "()" $ nf run () , bench "oneElement ()" $ nf (run . S.oneElement) () , bench "oneAttribute" $ nf (run . (ClassA :=)) "" , bench "oneAttribute ()" $ nf (run . (ClassA :=)) () , bench "oneAttribute Proxy" $ nf (run . (ClassA :=)) (Proxy :: Proxy "abc") , bench "parallelAttribute" $ nf (\x -> run $ ClassA := x # IdA := x) "" , bench "elementWithAttribute" $ nf (\x -> run $ Div :@ (ClassA := x) :> x) "" , bench "elementWithParallelAttribute" $ nf (\x -> run $ Div :@ (ClassA := x # IdA := x) :> x) "" , bench "listOfAttributes" $ nf (\x -> run [ClassA := x, ClassA := x]) "" , bench "listOfListOf" $ nf (\x -> run $ Div :> [I :> [Span :> x]]) "" ] string :: Benchmark string = bgroup "String" [ bench "randomString" $ nf (run . (# randomString)) (1::Int) , bench "randomStringRaw" $ nf (run . (# randomStringRaw)) (1::Int) , bench "randomTextStrict" $ nf (run . (# randomTextStrict)) (1::Int) , bench "randomTextStrictRaw" $ nf (run . (# randomTextStrictRaw)) (1::Int) , bench "randomTextLazy" $ nf (run . (# randomTextLazy)) (1::Int) , bench "randomTextLazyRaw" $ nf (run . (# randomTextLazyRaw)) (1::Int) , bench "literalString" $ nf (run . (# "ASCII: aeiou {v{H5@!(c@i/e^93q7+.8?u)c:F?&_*jQ:{s-G[MIO*!.F$%dXDROgf3{Sts6zR)RT\\RM#5^~3/uKGCb2i,\\EXMN;hb0CJ/?9s4KHet-Fr-kV9H~T_:UJ7^zxZt=1*JdEF%U wPzEb!$GN7v.b?k99^(il6*a!Z/$bbHhv.8sor lm1j\\i\\;BBlD|sOSwm,f9hrc3rtpR454Lmqi0!'Xfk>L>;*%a(.W+tT)4f/yOHR_.Vscl3DIkeNs8s84B4WfzL&1^oiL6|Iv{4)v7&j_Y2)KYGp_\"`e#B{.TYqFyrXinq1*/=JTquF,*_pY`tdoi2~(?bZqS?i$5fSVmIE6/FW/F=^`5=.=v#\"]+{lw/(VUvY$'kOld,M'rKQY\\fO}+G|n-!X\\5@8L0C|hUMj5/8Mq`Rzg#j;VCmd}[+*wPb>{$?1e|0xZ\"'u?YWx7\"]>,gK^GgJ_F5ea1@e'{ K37nSU[h8_[KraHm)R> @Rht{je~,^7'9m8*O;2}x'{Z/B5l$~+jV.br@tFrFf?C1,[1fkjPzK?f.GP4 y-d)=#n'+99B0$V^^flg`AA9YlQ4t:Om.',9D2:c%i~YXNyJ2cQg=SVb34~c).1@U7'?_*JMkZWMpgO)&P(_QMAyolbwb%+Ep!?j;tcjEat>g>u97tfQ bNU#A783O1=K@)C;BW 4XlHor4}alsfCW[!3<=;(9fIeBE=AHd,`k!q94D8d^|v^B?(O;G*b|Zt_#!pdM[qD8Ki>fnNzRGY*;1oI{>?Kad4b6XUq^MmF=r+P\\VuP78*-stkdnA%;ogs\"2d&#+fu8F9BXE(h%o,aoy$oufM\"(CGaO+lZqEuQ{`LL#b}Cog|y^N{WL*'1`KXHBS&13#ZEdvHE?:${N/wM ^}m40qaX6Qt_+aOu~6L,La rHkaEu\\%tDYLGHj3\\Yso7o\\rx%,_F^znD*}*mv9I$$\"}jg2ZP#f ,;*9|\\xi^{|;2)KtbM=U?Zr_:gI$OoXngAQ4ec.>d7>~1.W{OI.Rn*cMO4 3 CLR>h%c:C`\"J{0tX,V9f2!b;nIjP3;!(\\?G.dV`uI8!\">N;yoN9@;IVFg@w{l.h7K{zbQn^,=v[_%y[IdO3If#gGZ/WtDsAus!3>RymX>D-G7^hI~wj!'@w`CFN88Z_2p1NKC@iW-UB8S9kk.EWgTrWJe=s{g`:[{kn.bRIn^gM1y,u#RA|VOO,Ay39tB&YkxopGc*tQT`y*\"rv\"!3l\"rsHfYkaMBZ+%HJ-'sl( |Puq\\dM{H% Wr:\">b1<|}7c#+Q]L,>*WU2(%~SBGiS6u[yB2iaYmV23b&c0BFbn\"c1/Gf;`1\\uKGw\\,tj#fsx+73*am~^>f/GwQ75-\"/]C*|e`ys}]]XfdZcg0>AseXE:*B5&.)^9@:$j0f;eeN6,j7{Q|K'6On-#\"Rav0a=LTUX9mIkH?Y$^a}U|LwOGa}3w3q7iB.cs}:up/*)#Fny34()\"ebt!]J7K,nZ8tOC,48\\gs;P]H+qWHWm\\LCy'6$pNLM}^haz&H(z[[EIXrBxHYD`5i17 )>$oDK\\xe:OEny6B}F`%7CR|k4G\\I?r~s(o:?\"(}s4{VT9+id@N:bzFC E[&%N}2G+VMbv}XC[BZ[kJ]V=gL-Ph](TVe,vpzaK7B0+K|c<:n0mSm3.:2U,j4cwZP1U1d{:5SWf(f[NXXM~7-_bk%oK{O@I|5U)on,\"-mC!uLF*`Pw\\vIOS7XJ.h~]t^^9CY#3H-1]g6s,_g_RyU-9TqccG3V)aa_}0IinfD6|?2+vQyRj_Q mWIAJBzw(/,OSB?xD&b}S}?? yX1!PDYWd.%!k@(:=hJZ%{.|;-ENBE>t$Z!,cr3J6:Rs;;.[}(OA$C(dh;?\"iC- \\ J?:+RBEdHQ`nj>.sS#4zXMwbSQRlNXAjz9C#:w~Yk&iYh)ZZz{RC99~6HWJFl:lFLxbgb=z,+l$P \\|Ak8UGx]64h.V_ Eg*cR9)D`G7{r5~XJ:lk0K'#~bIam9w'L'-l(xP`tz:9*3f/ROz9EM=MW2Yd~q!\\'47]3p]KR@.nniZ8l,{5HU>EUQxRX(V n:EcL_hLj#3V;yl*2czy~b ch}_[2,|j9D|HJS%em-=;'h;hqF$eDH]hDbtxgRjM=Je08AV9y-~gZ $KN_o=&@$qwE]^?D_'I5t3\"yS:_$\"'sC 9!Wvzh?58Ax5h `DQO/\\bG`t2!7_Fj#%qC%5+cA9-m9Xu*$`M4gJ\",5#*1:i=|]{i'pf:[hOTH7l#H~lKQfDjK/NyFV:ZM+HJ{W\\[4S!*lFP5-@sMsJW%,`'!J4[Jcs0WG/&|0)CBugj4fr,$-.<$NV,aGX4 @XrKga!`t@H.9x1PQ:9e^m8e3CiTT/wR^vEB+]?yGw.so(%>ZaGNn|@`ffeI>HoPBO&2L'3FMyI\"'BdObllKr8]D\\t(S&>`VXo2G.H#E`T'M3GQ3+6f:h^Na^5tBA1BV<]$]-K;ENy)\"7Y-4a|K57oeTE^b%.zkG[87vD 6#^[8*%SrSbg%;5*M{?s|vV{8\\)TPKZq']-j^wMQsu.-]_[r*<+hzZ@v:M::z3CqM]prE!8!e7D~-N>,FLb~ lA3GAC:\"oE}?m4hq'nfJ.=BQL#dyl/Qhw2bmgWt=JX_]FM3rSgJ2Hg`3?41R%\"\"iN[MD;O4-xX8B3L,F+9g! iEZ[3(97qQ/(pGZzY:BY8$ps#E`j}Trl~lyIrj{`'VDraHaMN-Y]%V\\U:tQ*m1W)V}|''-8wIBQ(01u|5_,.ZE3g@m9\";q_AbOa7TvelHS/|(tfJBm1KBBct+c}<#S}`?p>0)b^p)]4E\\*j3I`?L_~Oqhmh#*:,meS)Z<{~'~1],51n itIBtO+enEm}nH35ckS?^*hzv\"(~`AA|i\\emYgM!N40Ll@=)8AL[j:)^wkN?Qw+Fw,{aGORlUn`%g%)\",PW.y@#w`\"H,e#D^9WeGOP3: r:X(Tq35[as%\\r6{lC1$cx9NX\"FhjS -1ZksJrkoBFZbK4P^@~wm`RZ/@&i?~lv[1=A[Y!VlcfC(m=jL\"/=.aTkv{ W=s:xEcKO/^LA@o'[`C^*Iga/<'Rs\\:O!-&,xpZ-tPZY0H'rb*Ja\\.Ok2jl)$::\\|p#|9;goJ<'^7E^t(W~S@dKIg_KwlP:\" 7l|s$-hP^Hit~Dzr,'zh.2A& 8,]}Xb!p#GS[^#F}gFPxm|5pfjj=t?FYU37#ABC4`S@[UU0*r|_F`!1;QL@K,>G53t_S\"Y{f;#4*&wnJ%V-$+P7Az}k8Fqw=cxH!R^h]w:Ydgn<12h$Hvx!qV#&`{*@\\5yFdi\\HYX$*ij2R5MU_ExkuqG1}}T&66zrFC@R#%]ml{\"j&^&V[kq56A3-.4>G6( @7-\"7Q3lDm),lvL2P|b5$$+#L&fcWfwNv9Wwn4}S'j%urMWceqOmZ&sO)Id}wY&Ak#t-ut^Ci^wnR5eS6ez4{P|k/TjrdK@|7KF$9~Q)Eso@C2m(*&2sf[J4 Pl`uzm3CfZ=XRP0L&FhPDC#$aP`~teiQ6A8p/mOIBN{2J!0e4qrLSUpvRl<2-AK($Lwa%e2)xBhZ9Lt[fL%7\"Vp~$[WA=,?:2Jb3h$uwvPA4V&b{tTVS rhdI\\c][:ba&o\\;2YSNg gz,8@/.Kvsjp+OI6zgInKS~vh,*F]v3v.4~:m;i#5E8aYc]J)B:`K.N[;Zo>hGoF>S29G4/+oQ/i>OXxn^%i$O}|SI\\!'z@wSKCe2]Fj$[L\\YDDvs{}|%i uou6i]\\n5=Y+==FJIpjBi42[|*x(IZ.Qt8(w^qD+&1RS#/E998/gc]L.{2/$#$D+:J4x.}WEK3l c|-=>g`q*Y%P..8j%XYpl&n`8,^/?d$m`*0$\\BY_u#pW7f\"9;bvibvZYd$dT++K1tI*TmF{7B=b&N\"{SV:^U2\\h\"7+Ky_p&,2K!hk;61]XC!BFb4f(\\XkOCcHSJ<)It5dI+2r~8-eLY20&<\"~`v,uPq3\"Z8$1^B{%R*o$X4$$G^j\"I/*O.&`n)j,53#axtjx\\S%+12,##~L7[|wH?^%uUR}Ow&U/.&iy)#I|KD:\"K[!z:d1$;>~_5,[b?s?$^qen;O|4vf/P<:aShNx#S:^VS5sikFU>~ BObjd+\\j`(@0SQs`,a-*E`!GtxOe'n 0t[OL>'s`3^~[fCUY<_|IaEasw:wD5FV9R'0X43Y}]RDjl,&aq#6i|s_`g=PM^V9yk$@Fvy?MN\\9wdtYt#.kqR2G8i?ND;LqMU?d'L3~]#x{KT\\rNkl7;_ceL}{B-~6$jt}~ZTP/RwwI\\`l6dVN{D1 tkc|8!ATe$@ohoX)z*$nM]U0tiahQo7^`pR},\\9.2Vt00Op.hhL+o}@h{aKg+1LDhyG5$n[0sxwFzH;%{&^5O`Z)LozW.LuVy/l`Dt}Cfz,+[vu\\~z.\"Z!8tqKmW4eRZfFiyw[@'X?Um(w A:iR?bL]eK%lp=|{K0]qdn,B:t)e]yEDwn!/Xsw:6w0hwK2iH|e&sy$61eja8cWQ~?UN..p|xA3Jm`~j9(w#&#Qv5*5Cbt$N2hF!]EKLE~iePo$,I5hf,/nv-8e{\\Rhza],.AtQY@oB,,E5.VIWh#@k`0v6}WB~A|6tLzG\\A.V:cOcGy-d2XBj4OUN;?7}mj{Cl*]bs8+#PKbU$?+qp=jcguw%BGC`}'orA:*&Cxnaf'3AI{7cLzE@SCrBYskD!2wDENR13zb>xQO/:k+[i(MX%4t]\"~j0E$+=AD(o:e\" nj30,aD#7Y#M b JImD~&?vkq5mL@J1s]].y=FNjC-m$L9K/Jp6Y[Y2uU((\\8K$2]8X-[(m? (g!X3iQPv7Qj&+:D=[ ?WZ}X)+L-M&%>I'k>k88FBn^kJ\\`7}3W5w~(zI(JXrO=lO#j%/24(TN\"]rMrMUGo%r?diYRhytsvp#Ec^,Yu-tN3c`$IEU^LI ,\"ca}I3/~E)LZkq8,Pf7WGdYk/]K:WqU`8pk)%iL:=q[MFE)\\roWx<<=(JQB(NP=,%1P4ghND:bvk0Q>TL_%sm_ZN';W1&%(>-X*e#UT/^;,A$dsYP&XD6'^$hd>x-,o:M9.WfnA/js,*z2-80$N* $O*$Nm@Wky6H{VG'wVa[IP(]K5pfbxsy.w83Wg^~>_Ynr+:JEUU^rMm xy0nL,bgc|Qsj\\\\&[a{kY@'{Fzp'BM\\,#3Lm^pT&@ad].},efGo'jHH\\zYFM~&#+/5bH={1zjemX5wsJ$R|JiED l^(]r]4?_{H%e[D`~6^Dy^BnCDn>?WuF&RbsLVc{/E-ulm,CL+(i*AnlM4UQ%-L![j[y))uE!=$2hc[/25L8rWCGh/{,#3Ot[X:eOv\"JP'\\+m3h!&{7BJ>U^x09&g};]@j,1i2y>j&ly6+NB~%0JtC#)$^-?jV$ #gJjo(*[J_$=M1O`*~M`^jmgHi-iHw5BJ}m5f=]Ilc/WaVAO\"<]}%P!,0*N?8\\R[ZFkuL`A;%YsCNs^3/y48k65_@(iB|nW2)84f)+=up,3l(yvp|)GYli_EI*+j}=r`!M}[4v6uEG9|Q \\uB.U^@_?C;-hi/l,]v-w{d^e*,}1k\\'%b9}6zv0k*ct2P]im:pq^q<5]6g)OU)@`JmA<2ot70=+p+0L4+Yfxs2`6Y$kTZgr?af2xq|0r4z6U'(MZY61\"|%veDF&M36UWv!,jx?4$jp,f%V VTO*0wy+33s-41&8wzMvX(/OD^2W^sNfmlM{IRZk0F@.>3iNg_aXK#d[.`N|83@B'b4*N`k=[5e{ZF\"G`Mt#?N\\kmI14DNI \\b4dO>(.B]\\S*bM4}qS?.BjF^Mrm:VE4A-N^c'w)YvMs/;!ccv\"MC\\lfMQu`Yf*a[8*@9A}a/HuE J`Es{{N 22euv&P'$=`)x\\,vaV!a8*RR.^q/R_x> r:_z>j-y&;'r\\U&T?D(xKns%7MIE~6I$3r)u!+OWwmNRJy)bk^S.1>2UxyBK #VG&hX69/Do+Xx'.RHp1RH$i}_I%|]o;iGMuS'^DZgZ\\a.N9a?(U G_@)voP5\\y<*kyxE5o?-G>p,Gbe6n 9-n~)y\"zTF)@kR'|GRb7mj_m#%p-kEewK3DZIqJ(|&c2R{\"T=t'&B3!Nci!6`mTH^'pXxyLH.VnVeJE}4n3/\"xEc/K?m1wbCpR 1SIeMpA>m`sVSfJBjqH<[ZOB;z6~t\"DH}nY1N*;-FS$&~?Hu_:ayFm]XHKV,H\"<^R&=Vh;LE)!0/G.Up'/Oz+jNwiRo\"c&x']mi\\D\"OC3KF)wKz;|3POvt%9!q9&c!1?bnnhm?8#Z)JR$d'r]?'!mV0n8Yk,o8U'G%UR>W7@aPn-f|9UXL5tPe}3NSs!C.jC0Y!u]O5@@;w).Kt8n%5L ';,}i}9>)_{ K<0T~P+m7|Lp%!v]4jIi]!7[bZsg=&Q~7Qb/{0# MMn-acT!L$$Ra+q#p9uI0blW{pE^XRYZ.V}j9v:4b|@9JJe|~<&vurWNDt-|moga{TzzZQiD|1\"b{TaY[|x((305cwRE\\`k9I\\}%P}Zs\\|D bhdcN'Gi}*7Zg_,v%Q]Q*!?DbG0cK^G(e|&.iTmsrFvT#_ek(.!;k]vqJ$\\242& I8Z~FE5~k3Hwz8-Mj(B,YUcHcB6)U;HMTvA)aq 80WyT_n8/N/NQnv+9#j\\Ta\\*FlSk3{suX^SZ*vn h1u5]ubT>MtI`f5kH,&Q9eWD\\6\"p. kc;j|yjm'p81E*:|d)>W5;URa.~yWg+\"%)TZ|>)cv\"|*]IVg|fFstUh")) (1::Int) , bench "literalStringUtf8" $ nf (run . (# "UTF8: äeiöü {v{H5@!(c@i/e^93q7+.8?u)c:F?&_*jQ:{s-G[MIO*!.F$%dXDROgf3{Sts6zR)RT\\RM#5^~3/uKGCb2i,\\EXMN;hb0CJ/?9s4KHet-Fr-kV9H~T_:UJ7^zxZt=1*JdEF%U wPzEb!$GN7v.b?k99^(il6*a!Z/$bbHhv.8sor lm1j\\i\\;BBlD|sOSwm,f9hrc3rtpR454Lmqi0!'Xfk>L>;*%a(.W+tT)4f/yOHR_.Vscl3DIkeNs8s84B4WfzL&1^oiL6|Iv{4)v7&j_Y2)KYGp_\"`e#B{.TYqFyrXinq1*/=JTquF,*_pY`tdoi2~(?bZqS?i$5fSVmIE6/FW/F=^`5=.=v#\"]+{lw/(VUvY$'kOld,M'rKQY\\fO}+G|n-!X\\5@8L0C|hUMj5/8Mq`Rzg#j;VCmd}[+*wPb>{$?1e|0xZ\"'u?YWx7\"]>,gK^GgJ_F5ea1@e'{ K37nSU[h8_[KraHm)R> @Rht{je~,^7'9m8*O;2}x'{Z/B5l$~+jV.br@tFrFf?C1,[1fkjPzK?f.GP4 y-d)=#n'+99B0$V^^flg`AA9YlQ4t:Om.',9D2:c%i~YXNyJ2cQg=SVb34~c).1@U7'?_*JMkZWMpgO)&P(_QMAyolbwb%+Ep!?j;tcjEat>g>u97tfQ bNU#A783O1=K@)C;BW 4XlHor4}alsfCW[!3<=;(9fIeBE=AHd,`k!q94D8d^|v^B?(O;G*b|Zt_#!pdM[qD8Ki>fnNzRGY*;1oI{>?Kad4b6XUq^MmF=r+P\\VuP78*-stkdnA%;ogs\"2d&#+fu8F9BXE(h%o,aoy$oufM\"(CGaO+lZqEuQ{`LL#b}Cog|y^N{WL*'1`KXHBS&13#ZEdvHE?:${N/wM ^}m40qaX6Qt_+aOu~6L,La rHkaEu\\%tDYLGHj3\\Yso7o\\rx%,_F^znD*}*mv9I$$\"}jg2ZP#f ,;*9|\\xi^{|;2)KtbM=U?Zr_:gI$OoXngAQ4ec.>d7>~1.W{OI.Rn*cMO4 3 CLR>h%c:C`\"J{0tX,V9f2!b;nIjP3;!(\\?G.dV`uI8!\">N;yoN9@;IVFg@w{l.h7K{zbQn^,=v[_%y[IdO3If#gGZ/WtDsAus!3>RymX>D-G7^hI~wj!'@w`CFN88Z_2p1NKC@iW-UB8S9kk.EWgTrWJe=s{g`:[{kn.bRIn^gM1y,u#RA|VOO,Ay39tB&YkxopGc*tQT`y*\"rv\"!3l\"rsHfYkaMBZ+%HJ-'sl( |Puq\\dM{H% Wr:\">b1<|}7c#+Q]L,>*WU2(%~SBGiS6u[yB2iaYmV23b&c0BFbn\"c1/Gf;`1\\uKGw\\,tj#fsx+73*am~^>f/GwQ75-\"/]C*|e`ys}]]XfdZcg0>AseXE:*B5&.)^9@:$j0f;eeN6,j7{Q|K'6On-#\"Rav0a=LTUX9mIkH?Y$^a}U|LwOGa}3w3q7iB.cs}:up/*)#Fny34()\"ebt!]J7K,nZ8tOC,48\\gs;P]H+qWHWm\\LCy'6$pNLM}^haz&H(z[[EIXrBxHYD`5i17 )>$oDK\\xe:OEny6B}F`%7CR|k4G\\I?r~s(o:?\"(}s4{VT9+id@N:bzFC E[&%N}2G+VMbv}XC[BZ[kJ]V=gL-Ph](TVe,vpzaK7B0+K|c<:n0mSm3.:2U,j4cwZP1U1d{:5SWf(f[NXXM~7-_bk%oK{O@I|5U)on,\"-mC!uLF*`Pw\\vIOS7XJ.h~]t^^9CY#3H-1]g6s,_g_RyU-9TqccG3V)aa_}0IinfD6|?2+vQyRj_Q mWIAJBzw(/,OSB?xD&b}S}?? yX1!PDYWd.%!k@(:=hJZ%{.|;-ENBE>t$Z!,cr3J6:Rs;;.[}(OA$C(dh;?\"iC- \\ J?:+RBEdHQ`nj>.sS#4zXMwbSQRlNXAjz9C#:w~Yk&iYh)ZZz{RC99~6HWJFl:lFLxbgb=z,+l$P \\|Ak8UGx]64h.V_ Eg*cR9)D`G7{r5~XJ:lk0K'#~bIam9w'L'-l(xP`tz:9*3f/ROz9EM=MW2Yd~q!\\'47]3p]KR@.nniZ8l,{5HU>EUQxRX(V n:EcL_hLj#3V;yl*2czy~b ch}_[2,|j9D|HJS%em-=;'h;hqF$eDH]hDbtxgRjM=Je08AV9y-~gZ $KN_o=&@$qwE]^?D_'I5t3\"yS:_$\"'sC 9!Wvzh?58Ax5h `DQO/\\bG`t2!7_Fj#%qC%5+cA9-m9Xu*$`M4gJ\",5#*1:i=|]{i'pf:[hOTH7l#H~lKQfDjK/NyFV:ZM+HJ{W\\[4S!*lFP5-@sMsJW%,`'!J4[Jcs0WG/&|0)CBugj4fr,$-.<$NV,aGX4 @XrKga!`t@H.9x1PQ:9e^m8e3CiTT/wR^vEB+]?yGw.so(%>ZaGNn|@`ffeI>HoPBO&2L'3FMyI\"'BdObllKr8]D\\t(S&>`VXo2G.H#E`T'M3GQ3+6f:h^Na^5tBA1BV<]$]-K;ENy)\"7Y-4a|K57oeTE^b%.zkG[87vD 6#^[8*%SrSbg%;5*M{?s|vV{8\\)TPKZq']-j^wMQsu.-]_[r*<+hzZ@v:M::z3CqM]prE!8!e7D~-N>,FLb~ lA3GAC:\"oE}?m4hq'nfJ.=BQL#dyl/Qhw2bmgWt=JX_]FM3rSgJ2Hg`3?41R%\"\"iN[MD;O4-xX8B3L,F+9g! iEZ[3(97qQ/(pGZzY:BY8$ps#E`j}Trl~lyIrj{`'VDraHaMN-Y]%V\\U:tQ*m1W)V}|''-8wIBQ(01u|5_,.ZE3g@m9\";q_AbOa7TvelHS/|(tfJBm1KBBct+c}<#S}`?p>0)b^p)]4E\\*j3I`?L_~Oqhmh#*:,meS)Z<{~'~1],51n itIBtO+enEm}nH35ckS?^*hzv\"(~`AA|i\\emYgM!N40Ll@=)8AL[j:)^wkN?Qw+Fw,{aGORlUn`%g%)\",PW.y@#w`\"H,e#D^9WeGOP3: r:X(Tq35[as%\\r6{lC1$cx9NX\"FhjS -1ZksJrkoBFZbK4P^@~wm`RZ/@&i?~lv[1=A[Y!VlcfC(m=jL\"/=.aTkv{ W=s:xEcKO/^LA@o'[`C^*Iga/<'Rs\\:O!-&,xpZ-tPZY0H'rb*Ja\\.Ok2jl)$::\\|p#|9;goJ<'^7E^t(W~S@dKIg_KwlP:\" 7l|s$-hP^Hit~Dzr,'zh.2A& 8,]}Xb!p#GS[^#F}gFPxm|5pfjj=t?FYU37#ABC4`S@[UU0*r|_F`!1;QL@K,>G53t_S\"Y{f;#4*&wnJ%V-$+P7Az}k8Fqw=cxH!R^h]w:Ydgn<12h$Hvx!qV#&`{*@\\5yFdi\\HYX$*ij2R5MU_ExkuqG1}}T&66zrFC@R#%]ml{\"j&^&V[kq56A3-.4>G6( @7-\"7Q3lDm),lvL2P|b5$$+#L&fcWfwNv9Wwn4}S'j%urMWceqOmZ&sO)Id}wY&Ak#t-ut^Ci^wnR5eS6ez4{P|k/TjrdK@|7KF$9~Q)Eso@C2m(*&2sf[J4 Pl`uzm3CfZ=XRP0L&FhPDC#$aP`~teiQ6A8p/mOIBN{2J!0e4qrLSUpvRl<2-AK($Lwa%e2)xBhZ9Lt[fL%7\"Vp~$[WA=,?:2Jb3h$uwvPA4V&b{tTVS rhdI\\c][:ba&o\\;2YSNg gz,8@/.Kvsjp+OI6zgInKS~vh,*F]v3v.4~:m;i#5E8aYc]J)B:`K.N[;Zo>hGoF>S29G4/+oQ/i>OXxn^%i$O}|SI\\!'z@wSKCe2]Fj$[L\\YDDvs{}|%i uou6i]\\n5=Y+==FJIpjBi42[|*x(IZ.Qt8(w^qD+&1RS#/E998/gc]L.{2/$#$D+:J4x.}WEK3l c|-=>g`q*Y%P..8j%XYpl&n`8,^/?d$m`*0$\\BY_u#pW7f\"9;bvibvZYd$dT++K1tI*TmF{7B=b&N\"{SV:^U2\\h\"7+Ky_p&,2K!hk;61]XC!BFb4f(\\XkOCcHSJ<)It5dI+2r~8-eLY20&<\"~`v,uPq3\"Z8$1^B{%R*o$X4$$G^j\"I/*O.&`n)j,53#axtjx\\S%+12,##~L7[|wH?^%uUR}Ow&U/.&iy)#I|KD:\"K[!z:d1$;>~_5,[b?s?$^qen;O|4vf/P<:aShNx#S:^VS5sikFU>~ BObjd+\\j`(@0SQs`,a-*E`!GtxOe'n 0t[OL>'s`3^~[fCUY<_|IaEasw:wD5FV9R'0X43Y}]RDjl,&aq#6i|s_`g=PM^V9yk$@Fvy?MN\\9wdtYt#.kqR2G8i?ND;LqMU?d'L3~]#x{KT\\rNkl7;_ceL}{B-~6$jt}~ZTP/RwwI\\`l6dVN{D1 tkc|8!ATe$@ohoX)z*$nM]U0tiahQo7^`pR},\\9.2Vt00Op.hhL+o}@h{aKg+1LDhyG5$n[0sxwFzH;%{&^5O`Z)LozW.LuVy/l`Dt}Cfz,+[vu\\~z.\"Z!8tqKmW4eRZfFiyw[@'X?Um(w A:iR?bL]eK%lp=|{K0]qdn,B:t)e]yEDwn!/Xsw:6w0hwK2iH|e&sy$61eja8cWQ~?UN..p|xA3Jm`~j9(w#&#Qv5*5Cbt$N2hF!]EKLE~iePo$,I5hf,/nv-8e{\\Rhza],.AtQY@oB,,E5.VIWh#@k`0v6}WB~A|6tLzG\\A.V:cOcGy-d2XBj4OUN;?7}mj{Cl*]bs8+#PKbU$?+qp=jcguw%BGC`}'orA:*&Cxnaf'3AI{7cLzE@SCrBYskD!2wDENR13zb>xQO/:k+[i(MX%4t]\"~j0E$+=AD(o:e\" nj30,aD#7Y#M b JImD~&?vkq5mL@J1s]].y=FNjC-m$L9K/Jp6Y[Y2uU((\\8K$2]8X-[(m? (g!X3iQPv7Qj&+:D=[ ?WZ}X)+L-M&%>I'k>k88FBn^kJ\\`7}3W5w~(zI(JXrO=lO#j%/24(TN\"]rMrMUGo%r?diYRhytsvp#Ec^,Yu-tN3c`$IEU^LI ,\"ca}I3/~E)LZkq8,Pf7WGdYk/]K:WqU`8pk)%iL:=q[MFE)\\roWx<<=(JQB(NP=,%1P4ghND:bvk0Q>TL_%sm_ZN';W1&%(>-X*e#UT/^;,A$dsYP&XD6'^$hd>x-,o:M9.WfnA/js,*z2-80$N* $O*$Nm@Wky6H{VG'wVa[IP(]K5pfbxsy.w83Wg^~>_Ynr+:JEUU^rMm xy0nL,bgc|Qsj\\\\&[a{kY@'{Fzp'BM\\,#3Lm^pT&@ad].},efGo'jHH\\zYFM~&#+/5bH={1zjemX5wsJ$R|JiED l^(]r]4?_{H%e[D`~6^Dy^BnCDn>?WuF&RbsLVc{/E-ulm,CL+(i*AnlM4UQ%-L![j[y))uE!=$2hc[/25L8rWCGh/{,#3Ot[X:eOv\"JP'\\+m3h!&{7BJ>U^x09&g};]@j,1i2y>j&ly6+NB~%0JtC#)$^-?jV$ #gJjo(*[J_$=M1O`*~M`^jmgHi-iHw5BJ}m5f=]Ilc/WaVAO\"<]}%P!,0*N?8\\R[ZFkuL`A;%YsCNs^3/y48k65_@(iB|nW2)84f)+=up,3l(yvp|)GYli_EI*+j}=r`!M}[4v6uEG9|Q \\uB.U^@_?C;-hi/l,]v-w{d^e*,}1k\\'%b9}6zv0k*ct2P]im:pq^q<5]6g)OU)@`JmA<2ot70=+p+0L4+Yfxs2`6Y$kTZgr?af2xq|0r4z6U'(MZY61\"|%veDF&M36UWv!,jx?4$jp,f%V VTO*0wy+33s-41&8wzMvX(/OD^2W^sNfmlM{IRZk0F@.>3iNg_aXK#d[.`N|83@B'b4*N`k=[5e{ZF\"G`Mt#?N\\kmI14DNI \\b4dO>(.B]\\S*bM4}qS?.BjF^Mrm:VE4A-N^c'w)YvMs/;!ccv\"MC\\lfMQu`Yf*a[8*@9A}a/HuE J`Es{{N 22euv&P'$=`)x\\,vaV!a8*RR.^q/R_x> r:_z>j-y&;'r\\U&T?D(xKns%7MIE~6I$3r)u!+OWwmNRJy)bk^S.1>2UxyBK #VG&hX69/Do+Xx'.RHp1RH$i}_I%|]o;iGMuS'^DZgZ\\a.N9a?(U G_@)voP5\\y<*kyxE5o?-G>p,Gbe6n 9-n~)y\"zTF)@kR'|GRb7mj_m#%p-kEewK3DZIqJ(|&c2R{\"T=t'&B3!Nci!6`mTH^'pXxyLH.VnVeJE}4n3/\"xEc/K?m1wbCpR 1SIeMpA>m`sVSfJBjqH<[ZOB;z6~t\"DH}nY1N*;-FS$&~?Hu_:ayFm]XHKV,H\"<^R&=Vh;LE)!0/G.Up'/Oz+jNwiRo\"c&x']mi\\D\"OC3KF)wKz;|3POvt%9!q9&c!1?bnnhm?8#Z)JR$d'r]?'!mV0n8Yk,o8U'G%UR>W7@aPn-f|9UXL5tPe}3NSs!C.jC0Y!u]O5@@;w).Kt8n%5L ';,}i}9>)_{ K<0T~P+m7|Lp%!v]4jIi]!7[bZsg=&Q~7Qb/{0# MMn-acT!L$$Ra+q#p9uI0blW{pE^XRYZ.V}j9v:4b|@9JJe|~<&vurWNDt-|moga{TzzZQiD|1\"b{TaY[|x((305cwRE\\`k9I\\}%P}Zs\\|D bhdcN'Gi}*7Zg_,v%Q]Q*!?DbG0cK^G(e|&.iTmsrFvT#_ek(.!;k]vqJ$\\242& I8Z~FE5~k3Hwz8-Mj(B,YUcHcB6)U;HMTvA)aq 80WyT_n8/N/NQnv+9#j\\Ta\\*FlSk3{suX^SZ*vn h1u5]ubT>MtI`f5kH,&Q9eWD\\6\"p. kc;j|yjm'p81E*:|d)>W5;URa.~yWg+\"%)TZ|>)cv\"|*]IVg|fFstUh")) (1::Int) ] -- take 10000 . map chr . randomRs (32,126) <$> newStdGen {-# INLINE run #-} run :: Document a => a -> Word8 run = foldl1' (+) . renderByteString {-# NOINLINE randomString #-} randomString :: String randomString = unsafePerformIO $ take 10000 . randoms <$> newStdGen {-# NOINLINE randomStringRaw #-} randomStringRaw :: Raw String randomStringRaw = unsafePerformIO $ Raw . take 10000 . randoms <$> newStdGen {-# NOINLINE randomTextStrict #-} randomTextStrict :: T.Text randomTextStrict = unsafePerformIO $ T.pack . take 10000 . randoms <$> newStdGen {-# NOINLINE randomTextStrictRaw #-} randomTextStrictRaw :: Raw T.Text randomTextStrictRaw = unsafePerformIO $ Raw . T.pack . take 10000 . randoms <$> newStdGen {-# NOINLINE randomTextLazy #-} randomTextLazy :: LT.Text randomTextLazy = unsafePerformIO $ LT.pack . take 10000 . randoms <$> newStdGen {-# NOINLINE randomTextLazyRaw #-} randomTextLazyRaw :: Raw LT.Text randomTextLazyRaw = unsafePerformIO $ Raw . LT.pack . take 10000 . randoms <$> newStdGen comparison :: Benchmark comparison = bgroup "Comparison" [ bgroup "synthetic page" [ bench "blaze-html" $ nf (foldl1' (+) . renderHtml . (\x -> BL.blazePageA x >> BL.blazePageA x >> BL.blazePageA x >> BL.blazePageA x)) (fromString "TEST") , bench "type-of-html" $ nf (run . (\x -> M.pageA x # M.pageA x # M.pageA x # M.pageA x)) "TEST" , bench "compactHTML" $ nf (foldl1' (+) . renderCompactByteString (compactHTML $ M.pageA (V @"x") # M.pageA (V @"x") # M.pageA (V @"x") # M.pageA (V @"x"))) (Put "TEST") ] , bgroup "table 50x10" [ bench "blaze-html" $ nf (foldl1' (+) . renderHtml . BL.blazeTable) (50,10) , bench "type-of-html" $ nf (run . M.table) (50,10) ] , bgroup "hackage upload" [ bench "blaze-html" $ nf (foldl1' (+) . renderHtml . BL.hackageUpload) (fromString "Uploading packages and package candidates | Hackage") , bench "type-of-html" $ nf (run . ET.hackageUpload) "Uploading packages and package candidates | Hackage" , bench "compactHTML" $ nf (foldl1' (+) . renderCompactByteString (compactHTML $ ET.hackageUpload (V @"x"))) (Put "Uploading packages and package candidates | Hackage") ] ] scaling :: Benchmark scaling = bgroup "Scaling" [ bgroup "2 divs" [ bench "normal" $ nf (run . divs2) "input" , bench "compact" $ nf (foldl1' (+) . renderCompactByteString (compactHTML $ divs2 (V @"x"))) (Put "input") ] , bgroup "4 divs" [ bench "normal" $ nf (run . divs4) "input" , bench "compact" $ nf (foldl1' (+) . renderCompactByteString (compactHTML $ divs4 (V @"x"))) (Put "input") ] , bgroup "8 divs" [ bench "normal" $ nf (run . divs8) "input" , bench "compact" $ nf (foldl1' (+) . renderCompactByteString (compactHTML $ divs8 (V @"x"))) (Put "input") ] , bgroup "16 divs" [ bench "normal" $ nf (run . divs16) "input" , bench "compact" $ nf (foldl1' (+) . renderCompactByteString (compactHTML $ divs16 (V @"x"))) (Put "input") ] , bgroup "32 divs" [ bench "normal" $ nf (run . divs32) "input" , bench "compact" $ nf (foldl1' (+) . renderCompactByteString (compactHTML $ divs32 (V @"x"))) (Put "input") ] ] where divs2 x = Div :> "lorem;" # x # Div :> "ipsum<>" divs4 = divs2 . divs2 divs8 = divs4 . divs4 divs16 = divs8 . divs8 divs32 = divs16 . divs16