From 2e26176234e87d99f36a4c544cc16eb914ae4609 Mon Sep 17 00:00:00 2001 From: mutouyun Date: Wed, 2 Jan 2019 11:58:55 +0800 Subject: [PATCH] update performence data; add implementation of pool_alloc::clear --- README.md | 51 +++++++------------------------------ performence.xlsx | Bin 0 -> 31733 bytes src/memory/alloc.hpp | 2 -- src/memory/resource.hpp | 44 +++++++++++++++++++++----------- src/memory/wrapper.hpp | 15 ++++++++++- test/main.cpp | 2 ++ test/test_circ.cpp | 45 ++++++--------------------------- test/test_ipc.cpp | 54 +++++++++++----------------------------- test/test_mem.cpp | 1 + 9 files changed, 79 insertions(+), 135 deletions(-) create mode 100644 performence.xlsx diff --git a/README.md b/README.md index 1f4f902..3b9e674 100644 --- a/README.md +++ b/README.md @@ -13,49 +13,16 @@ A high-performance inter-process communication using shared memory on Linux/Wind ## Performance - | Environment | Value | - | ------ | ------ | - | CPU | AMD Ryzen™ 5 1400 Quad-Core | - | RAM | 32 GB | - | OS | Windows 10 Pro for Education x64 | - | Compiler | MSVC 2017 15.9.4 x64 | + Environment | Value + ------ | ------ + Device | Lenovo ThinkPad T450 + CPU | Intel® Core™ i5-4300U @ 2.5 GHz + RAM | 16 GB + OS | Windows 7 Ultimate x64 + Compiler | MSVC 2017 15.9.4 -UT & benchmark test function, see: [test](test) - -### ipc::circ::queue - - | PROD-CONS: 1-N | DATAS: 12bits * 1000000 | - | ------ | ------ | - | `1-1` | `47.4050 ms, 0.047405 us/d` | - | `1-2` | `113.793 ms, 0.113793 us/d` | - | `1-4` | `319.196 ms, 0.319196 us/d` | - | `1-8` | `225.258 ms, 0.225258 us/d` | - -### ipc::route - - | PROD-CONS: 1-N | DATAS: Random 2-256bits * 100000 | - | ------ | ------ | - | `RTT` | `103.280 ms, 1.03280 us/d` | - | `1-1` | `78.6670 ms, 0.78667 us/d` | - | `1-2` | `165.601 ms, 1.65601 us/d` | - | `1-4` | `223.183 ms, 2.23183 us/d` | - | `1-8` | `246.161 ms, 2.46161 us/d` | - -### ipc::channel - - | PROD-CONS: N-M | DATAS: Random 2-256bits * 100000 | - | ------ | ------ | - | `RTT` | `184.711 ms, 1.84711 us/d` | - | `1-1` | `122.186 ms, 1.22186 us/d` | - | `1-2` | `226.518 ms, 2.26518 us/d` | - | `1-4` | `369.239 ms, 3.69239 us/d` | - | `1-8` | `620.199 ms, 6.20199 us/d` | - | `2-1` | `287.960 ms, 1.43980 us/d` | - | `4-1` | `542.050 ms, 1.35512 us/d` | - | `8-1` | `1406.61 ms, 1.75826 us/d` | - | `2-2` | `475.095 ms, 2.37547 us/d` | - | `4-4` | `1455.05 ms, 3.63763 us/d` | - | `8-8` | `5485.06 ms, 6.85633 us/d` | +UT & benchmark test function: [test](test) +Performance data: [performence.xlsx](performence.xlsx) ## Reference diff --git a/performence.xlsx b/performence.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ce671a6a2ac30ea64e0ca83164bf0242ca53b17a GIT binary patch literal 31733 zcmeF2Q;aBKv#!_J_N=jO+qP}nwr$(i8r!yQ+vc8sCp$UUJ2^Ker*As_rPCK(UDfry z?^6cIgvR9ns(*eD0AXrHeG_9DW2fH>DOo|u|1AE`!Hv4UmF@i}F$<7*V`cI6Igg|X zkrH|e8`iQHc4QQh97&Z064~ zvVsIl#33Se#j-$-JL?_L?_)havh!FRfoP$GEqN7?0nnD+Kf4)Up;fE}&mN)TFu^cd z$=thE6x6%R)c|?Z|LB)T+MA}u8BxOMuVqevv7r{RfVmf1*29ap2Fw&J2vOIWoFD_45`SIiFT`(F?8;6`6uFzESNT*dk z>5Ol@&RH(c^ANB;RoGbYYd{?FwB=`;B)^b`o$_EMv-c5i9*h)0=s_s{MkxVK6%!FF zCjfQ|WOYo-)udUxT60Bgx3^pV8rk>(nbJ7yW1jp$eMqpQ0;{S*SdtC~i1$OM|eI)o~J z6geL98G!i4nj>5An`BgVPe5$yKcAH*ON1{V*DgV99}H6ft>C!TX3hj?W`!2G zuCz?Q3b`)%At0$NzvYpM_PGt;QwVEB-Kp(sGPe!(vFSC(jA30CUN3LgUtB2Td;(8W z5q`O_*5`AC^9cG5C+Ok*kEky>THj(tzgfNK{13iGe+HP#f7Qsg&0dgBqH0OtNZj@! zoEI9zeq+K$OqTXYU&vkrJiNG~!Z7(+H3u<6{h%#muoeYt{kd&KQfzXEZ7_&1$S3yd zZkhe6p=CGksp$FKYHkLHU?oQOg5ZjM<^DL81M!1|slbAItwdY|^b>l<``7T?VFbQ6 z`A|({1kz+J8j%b?{m`Xfh-{ATej?tsL+ws}}}ulFlTMPuwb?*^d0{iuJ4 zX>bpj-lOzys}!a%YBMT!jtclzXYHGT3X}PUc516$tkdf1ch>*+`9EC#TUOFD)*T@G z{?D>f<)n_C1{(5q<%Cr%%CdTf$P3{AH+$KRbY^jrKTzO9_6bJlQInWc7scMh7&Cc+ z2SVynHOe@cu5luYT;lSR=8+HdB3h(O)WQNqn$^ib4kIm&0LfsSF>#J6 zLVYfN_DmUdt7Ce4t*JWKc*i#3W6=J>X$qXR9w6=&`aGznl`R>v6NE69i+;$`r{DPN zciV=bG&lXmU)OGtKfGJ%qPRa)bK-Hb_)JAUWLw_q@4V|CFj@wHTgm+nj?BJw;oj^2 zOY#5Tq1e}cED3Ttp5*rEAHt;x0_$IyK!4%a_S%Z*-f>!DqWTY;@a5U5D#oqQ`^ix z)hm`880j7=6P267#R!lRIe(#qDi_YZqzz)mx8O$9yK56BeFdt4K7dqFs!$``_9X-M z)wdYZzLj+-UjaPm!lo=LAvpBRCr^Pe8T0XwkN5qZgcwq6^_(JC`KK!Hda0CO=r=sO zQB1?$?ncTQnCl$?bVxb#PCiTV9uXX$lQops^M+m+^)7$&zr@7C^NiyV$=jOi&P#iBzDK**r+3R zfxr2$d>$SjPTmRz6ALN z(|Es6f?P9TraF)v0&oGsO0C39ZjGEFQFG)*SRa=@&OU-rrj6g{wnT%tDir# zh5FB2b3P`C&ImgQo zcd9=pFS#6NzuaEn9NU+naet44(~W=U#@&TQH<<(P055NnY~7_mdTOav;vf|4)trH= zQ=h5at^<~U$Dm_*=CQ6^P^!BmTs;`$*FLj1JgyPDK<-3-Ng|({S=iS8R^9}vKDS6j z@d8I-W+V#2UJ(BIPcK>i5K`?jH@Ft!QX>6$`kQIKC7A`a^$xE$h}ki5PWF}1Ghth+bgu}~Ho9Cn5q=c8aNUYp zt;yNu#b0}2{QTom)M791yX>2Y-E>GsSI_hT0wDvIuwAQe>4 ze}jtIQ0&CPEqc+N$@6AjIrDn`2H2TsQ7ebZ6n5nttyiuBH#~xdnFdi>HJbBr!2z}Z zj6b4PkuFv;bwiG9 z;~!KJxo7J%@W!3>oZtR$zTNr?K_$>+R1Ob3;bBBr+f%@F?|YjomL5zcq`?T>=$6=3 z)1wi6@t(P3s;f3VJF}M9>?)^X433;i-&A>_|G@_gy%_Zg%PJM&QFsBg{bG%2kY2J> z=LvBwNKl{QKthdl2`rY@?%&D6c1zxk2wNi?9R)6)ku$CS;pT#Pne4m2uFQ%ZNo%54 zPn@thWpBEJ$ENi^+j`;G5&3wOqhuXLK7iac1EWwGEYQ-dC8j@-_`1-dJfJqi$FxB( z$XGS9K7v&7fBmhhSi3Vu{o@W#>{_=A%Svm{YMvFjMmo zE0!qc)FB~VaXB@;w1DNpi^!k&=;KJm)&qxnMc#K{_c zf~zP7^O7tVbG`D1Fofas*4Q4#Y6Wd0nO|iaXJfnb+gN6$?+Cyf(cRVb6U1X^{&GOg zw)C1k6y-n%q;<4QS$(zy{ebIHQ{n2j@8N~MOJ_(Q$m|8#@wA~(d&sd3?%PatAI#Y) zyFnE2Na7`bW5b9$j<5YSpxmY}sULhrUY0B<=K#loV?!$^7mAfei{-2*s%2BE;EZug!81>UI85Z< z{vTlOm4tp{ko# zmX)Ge4;PSg7fDLivcrQL<=rLOxCGLvwhQ}I&Sr#(NR0Ik&pTF~&odhidnQOCrPM9hx+Dgxl2JcnP>FWK>%u)Ri5FBH!hybS`1X(}*s8bY9MT(qrh>*8*f?%p9>n^@1ea*Im z^P%vOa1%zpwQd^J8_H?VP0?H>(!$ZX?EQ6cAm|>51+$bRwW4Lxt(Oy8`wFp(kO+D| zPOeh4Tnf!*$|rACBmQ&qS$!sh>91$h;=&GCCCaox)lYxHz8^ZDGWHePke8&vGOris`}dZvgHV$jexC|)6*_HQME$P;#pqE7u}A@4s}t1eyytMC4KO{v^4mu*Lb zni6b0`rnlsIm4D%fA6~kRKgn?Vyf>V1sv$AUIqdte{2j1cwi_@2#a}+dl9yHW%D5l z*;6U)qBAjGRLU!KTI7&-dYI3$jwE*i)tC5-b=yVV(PMZCB+vT@h?`cPcAVw7W)hM( z0(j(uOgb&?ZLG-uRbp4Wy(U5Av-3@Lk2a7Fv=I~@-PI|@76FE~H5fJJgF;9$*yY8xQr^J@@r=xyJj znvEbOl!sN6l9=I^huGjK25ztH0|{g;c%z_yn6L;nB!>vvSZ*h6T3BPsR$=Ny2xDv*Sf4vG!;+S`1x1{H$N1411^O?o9$DPZy!|{6-k$E!i8-C z-a<95I)b>MB)##?G?aKfY3E6JZ{QH5VLM0j?-G#=-D%Wua=(!+P{v6E1b~-5M!m(k zH$Og6q%=F70yMYB^=6jx{(+g;XH%ie8~qaXDoFLR#@i;VXYRdPw|@#IO;fpA2J4s7 zHqgQC=?+DY&=Rmn%Bj+H3>Y$I9hl5_q2QcdHUY6+9ocyacWH*2#WCAIz}habuyBbp zmiD@d-1?FqLqTxw&WE)dI21!1D_B_$+y9|*s8L;aIW5GnTUsf|&-y6d-=aqI9)7!j zy9wpQy$#40Dv#SzpO#~{ve6ZL=rZ`4WXW{J;!{5+&ZBu`zBZfuSo4%(9-D;vo*;B`(T*^TwBoFccveqJ%bBs(f zDc|9hzftGT#@CJ?RhIoJgRkL=!`gh~J;G4(6mEe5AUfRrB4uBkSi18Gbu7iLcC4=728X{0Kh%(!_nw$Yv z-n!A!CWEvEn?4#*>!+Vt-K@x!x8~QpcXt}*(bYwOMIg5pTCt>rKv)C%-~WX~5;4%m zPlGcNal!BV2mvwj?yF=60hy?9S*=_=gvBOn8|o9x6X*`K5|N1WJ2b;i83b;LxQt|#Y>;zu z<$q@&nhWuJ5`$yBIqAJKRo1)qJ7}?1TZa(48By&SySwMH1)IF5C>ihu%<-P!rNt;r$2$ zaN zU|MxlKp8nVOtzYi1sClc<3)0Ebv%X9(;X2o~EbQLfrZzlw30ST|Xfz(Z=ha{Pjqh}6j;*X`jNNv03 z41<*Pbrn9H)-CA7;%etk9TOzj5W0IilkM7|`UYhF>VMry$0jiO)#>5z%-EF%`6|E#%)~eu!EsyV+vWBi%O8Gbsq!h9tP+{R0Ze=NvIhM z{;j@j{j;Khow>q3KQg{qohvt?jZommjTsq^00k+lwHQ6%BVe|qMImE`Pki3WZd8HF zQb&dwZ?B$+@j~9;Ni`;2b-xik5IGjt6u>d-vx-vvO=22fpR>N*9*gjsd3AbkRGgMe z*FuIH?tRRa(Y9u2M>bsY_RSYJyWOJ%=;q<3^B7J+%L3gS*&&NUs3c@8Kc@~e-o4-P z1lU|?T3uDps}I7Vxl(&r!)0#XZu(GgZ8Z?7kPtia0e{F zu+0Pi)&FYQA}i#1!%&^&{u#K7OHzzWrS3*o^l{VT_Za!hWb6x4wW?*Mtg)f~sMx

xM;PdX5$K2Xdzr%d|JBn+3jU2V%vqYrSN$?ze}czzUcP;B2z{@4Xvb;SQgf)R@p;2r zr5}^z6WP`(WtY~U}HNlv{Xz2Xmq zfE)QiDS@ydF8kO6JaqmE*p9h^o6mp)VtSHHed8o8CJkzG8b5X} zHHYVU+rRF9zor8!r7f)YX0UEw5x*}$OglFVgVC<(>NIcD;k<7Sr5BKvVhROp|Bc)$3 zGONUyXM4{ufHtbv+kMc(GQ#fG&Fhy2REJ5;PL`osg&jD9QIrz8geC&Yi(?%?n`uZ2 z+Y_$ii0n8Zy%L_3J)DN5?{^H^?~nC`uc<9@3K?T_#@itL*S?9(Q=EziW6AyYnfhJk z#oHmiHSsEsrhL+uroSdVbzg##(kJ3TNCANsu-J!aThxdDP(vl1a^At9g9zr{V4X@MGfGT3; z3;EXt`zX`(sTYmED#Wow?`mp(pF5TGoM95^hxA(5qpouuy`r1Z>vLLoHL^4HD!4J# zW16(Zsu{*MdxW}5Vny$R+a)epszmCBXq}B+7$744dAz#532q3m-(r5IyU^8qCOAOl zsy_%BDKRT8SD|u{*`LKj>32QS57mO2mFIPT1Emu74Xu7B6(nGQW^H2 zaGFP-`}@_mGfM&i67px@?7s?UzI0CA!4q~r*kP4reZ>dE4T{e%7s zC*Jo92VkCalLhHf^zCK>?238h3*}AZcIKeY?4#dmYB?j(%2#rxjk=9l=+g7mOYDV0 zPQGS0ke@`d{7IO`+U>-GcL}Ufb-Ta*50*{j2+G~jm|>kYdoOSKum6KR1%ob2%1HE) znjB!4_Wj@WAGTm6CNkZ6qjQqh@GT@sJG9tUS1fhsM^u@i8n8I4+L=;8U)DkNZ*lM$ zPEBTzE>f)@eCVwT(Ry$L**_u;LZD5i+~mAT zM4_wphNu}{Lo053cQMU(gE=VGZ8GX>ZLc6H?7dvE%76Q@IOgej)yfWDZQseWN9x=~ z?@CpP_{Po1w!diEK7w~#m|+;xeQr$+ZWWSgsV9h~+6?s%1znvmQ7Uq`n@eBk$}t$L zF#P8$@6WA$#zIFlw%y^P!)`)Jjh-~3Gdv`#Ut1u9)qVA=GgS{;ozGTY29LKgP1=a7Zp!-#|IRsiVXxOi0j?UR8EeqvroE#Nje=t=HVv5hyB(&hS zEtfdVrjnxUY43g@Sji1aDRYIqXKN|G^HSM@7h~*(OT!Il@^a4f5G0 zC)Q(W#@^sbZ;EEEO=d`dW~&8<27<1kTc{~}Zlqb1w8w)_CFcG*7oI+BxH!FGFCH98 zjujJRoF^W3BXB-yt_Zuj;RXTnYk+GNLMBi@_lFI7MJeMeFj+ij9J?1VScWk=3eLXY)14HO8qBW3$ze}-%uRSLEq zH>7TK7mURN4H@YCpwrmZfuiRkx2?z+GAu<2fe};rOU z3951amVi~a?;fUhq{|D^B#W38RJ~o$|LkSX3!lsN#|*4H2uimR82$fpJ>rp-GWXd8 z`j=FzJ`~V5?fU;~QrGG5o?kS|J#M(CPA=_8?E6;)c+$&00fk9$HH-Pl?qK6LIe-n* zzGt=MenRj6#@B$D(D!w#tt3RP?KQ|PmtGT?gP-x7E8lL8T*&bW48h4JFfJApO=3fuzTI4j)-$~t)bnakBf^_d|7x$_UR|1K@!qCyCEa| zcgFC|=VkBeBXTQ(pB(FIiw}rD+i;V_wm(|j$jqTPSXF`Fm_}Z>CYZh(uU^FB%9P?X zqq`IJ56(l1fCwUXCGQP5{it!0_D;0|Cg^6A3WD?a`3v_zRxMVaMKF`;9Od8!?0Aao z`UgL)O=Ka0S5*utWlcD6=HmM$-nEPCPI|~%hFXPR6}aIIEj-i+35 zxSi~>SbC7T*5X&8{LU~aq2rMcZu$IbnN6-^Bv%ZI<-sY)C+kA&fbG?eCtOov(%}$T zgxiR~x0$(TWU|?#FPQ6zB4DrlV)RH!ca|D9N<~#6%PiLVv@`SQ;o5=MwzkXCFr4nc z>W)8hd0W>o5|$~|G5BM}Flv3r@#*Ae=*OU0dB@|yKHC?722Ah~?n0Y=20QHNE1uc= z2Mvq7g*~dgaEj{*Jzb~f-{2~b1W05Z1#+}UE{{s1tAP1UF-AsmQ2P>2ll!X&c84NQ zCS$Q@28I9^EB@6OOp@Tr&cjPKzWR~Dt`td@!MgJ~;BMkADM&fFmpK2_D6mBG4+4J3 zZs<$YM3A|9twM}MMJy4H0n9MLBSY!FM6rMSLwU4msX6`9#X_Ottv~P~ov_Pa`Opd_ z#-@K=zJx1ah+*hsjP?}9e|&l>ymT*8sc}u2 zWq;Fv91g6`UGkE9?Y&-!q#oQ5ra>sV4&HjGu%GesailuVU3Y_Qp7R%!5YR}crMIIAc%1kMm>TNUf zBA{Qz%37)`+w(O|NjmvJ!<4AtE$_?#!g30MUe=2KMm4? zPvdVq!)S8O8%bZW#Jy#$Rp&jX-*|Pt>5=Gr17qV|Aj_l#KgcQp>4Q3168hAcS|}k5Ab_LP$Sx(0sv51?i!eQi(2Mixo4Shy0vjDfcw0 zk+9a4d}2Ghb9gZG^vlR*1+W&!5+eN=O!lG$-eIJ-6Rzv5-i@CwAb~}ADVr16N=E3j z0>)GF?cR62^R+SnB0YQgb$IJD%Jo@<{;ezc{Qg(e(=Y!Kq!`=Jz~b@Ce+<&YTqgYT zAJg!}@XYK7`raCV=0@qf;t$98sLELA-WkLS8j6ba%y|0qcwRKXVE3r5YfTa9+Md8L zbF%v5IlB;DAvY%shQS{gjt7|1$**cHmZN~-Q-qrc9!<%A@YNqhSI!YOE)|Ztxyt@9IZ|TJ@>Lg&FGpsCd(s@l7FCU~Glnq}XV^|o zIRxCCCY|9lAd9Re^+oo;EE7TEh@_`;y-hu0+P`NJ;1wC?Fk$Q=*JDeS=Qzf%+!fkg zz8dd7rd%2Cs(=oFs$_fI@vVB`+O{OyFw4re9q-;UFeuo6F0~F+{PG{`y;gZrA0N*H zN(E!|zx)TOuK>(u(dRG!;T)}h+wjYOtUL#IMh`Gl73!SX55F;M)npnknr3y63%aW$7kMHfpj*1}5Vf!5fjcE2Ig=*N2w;{!-r-b!N zv&e!N)`*xLNpd9)E+hRx&nQ$8OKfVGgj4ASp-9zAlZNgvQYeL(mMydkK*}EMHk1W64VZ zN9vCe=IlTq3EC1iU^4vWf0(^?4<;Ove)T`3+Jl(&U;anVK)CN;;nkF?p(%m?k`K3y zR|pWbbW=OWMM!q;hb2sPI%57J6kg>0cVvLq>%wz`-p)kcawSe`>%KJ|AiToE2jRp$ zea$)$Mp^vwRP&n%jh|IOBBowd_`cF^N@K}Zmjh*#XkwSs5mbl}u~bG7-k4|4m>A2X zf_~wQ2HgV;zrF(gOdlaB@u~8@>#~4G$Juz@CFj^#=wSk}jgBs|b1Qm&p zn=GgVo4(khgXc9o7f*45BHFazZqlvGX})aqiZuZNC_|_civZOU&`$!Zofv6A&Kd$V z4s6=Zhg{G^Wz@T^s%F5f9pBsBYv$XYb^qmm8u?o4&d`W{`5*4>^@xvO{;!7SAEs`c z{i>ZOaro<`u$G>v1uHI;mz9<0D^&VCpHfyTnBUrKv~PNQhIumC4YtJlZOKL`C|r8G z?!+kn+(Wns*98JM-z~Am#l<(oO<;w9KfbT^^U-#|x*q`;#v&bGMT>^eW@6dLlFNE} zt0hRU!<3xP(S6bf&v(=YTsBVHeRzc^%jA&nk#FZ_$#^ivh?Qy}n`q%q>%D6F3oiV~ zki_)5u9)TF0LUlpTVt?dYi0KFuuoTizn&(6KZ&}=U%m~Hrkg#F9>aFaRN*D8KE5#y z4Nz8I^Vn~s^B&#wii&`7^ppnyt=OUdH!(_Bjo; zj?(sb%IKocZ)i{2O|egTWWDCrB~Xo&drl~7(i4S>%9b82p*IgnA|s}H#hVJiHor~d zTVKDN^G3Sjw~Ch2Rc>Hc*xk*QDwJ2dTAd@ABKqVUj^U2nV$7+}QIC`7DaB_m1LTib zrU)#)zD0!9)iLVQ14V8)id{=v2DZ9!U@+`Qhi)+%M;;>1D=!I5GcY}&Re>lu{PLe@ zj)+J0MyBJ#`=b!9;Xig?FE{!t%N>9JDLG>6)0kqt5+Job69ebVm zcpWBD5Xl{0YU^R=@m=x8RVWpye&2VA1%;aS`hHYbr2ZKgzjl3X!PPb&GnxhAj%cXEexjTMciTLp9AQO)2g8;pY&WOxS~ zh3|09ht=T4Xl@cND$r~SL3lZqkGoxot^_X<>d-{*CLVK694Q6XE`CgQDOYfs>Je+O zqjZqpR58+sO)ZYQk{F#xFJA_3(DLR&;G;De3#rO5?IFWMS&U~xwJwzV%m1C|@TifI zp8(YxxeEUI<^S?<{`IWnwB!N{Vq_C>as2Xs*fD*k3h(03p@TMknlL zgh++{{hf!sU#IEunGVxmFCG&{PDldTZE^HG0%{TZ$|$cAUjXdow*^EBk#cf5J$fNI zCfD(UiQ(a(em*(T2|qi=Jm(0eW|~MAs`JJRQU;E|qoh`f@Qwfmic2@ITtNTh&fQ+VMG{CL;V^48Ijbkdyyx}fp2=3x0M5Z*Y;xQrEb zral^#1qQG#Pmd}!zsf#JD4|MgAo#g%c$*7?JlTj-?r55ebx=2o-x}J5qLzP$|Fo#V z&nK{p{!VAzHVxLqP)VT=Xs)39fG;t~-alCKhhi2YJ#cub$=<|y?*P*FjirDC#@~15 zSQR4&t%8eJ68CWye0y{PyVClW&XqAPd{4Yd^}2SO%N#_(rbDmL*z%*-?y-6chu;dQ zy3noJyJ6VXy(sUwj-~UVwksbd*a$uxh0BAMGuB+CHQn-CTR^c>j5>XBy)J)>N6 zNnZP>@6k3it}#)es>GQ-`#8l$Nrkbn;(ng;5FhjhV0Ex1ox3pz*UX&<%Wa>64s+oC zzMQc@mkvA(ClJ!EgKa&_I|FI-XB}R1wvl4ySzwibRYz}0g-unbhg$%tR33Li#?WT+ z{oIhaQ?_7G8lbM&EoQ1QiQ0YN)v`awhwXDvt8RZVO2gyd5eG;*v-EJrx1di_s(ZU# zK8ph#V2*|=)DX#74pr}`G|O+xwNp?)uHa>a3H>l+Nor;)l`BM60Uctwi={5>{XEIX z?FEK-vd2%ne&4P{g%>EpXaOvFL;SXYpb&eYd-k$x%0tp2x56=auzaRuN4M1=;Orc3 z(M^<&X&6`un=4h@>otr-pZL#H+CcTe>0VfGI9HRpNj_Y?BGn2S1s-Ue%5}02CY~z$ zuho$Ecn7gmyWaD61eC#9z3C}Py#G8vcVl-^R+UW6%OSMw0Z6 zp8Ad*A$qu*mQw#V=jNB-UXNQCwW`}c!7YZ^-E&tLhpm#wB-x9ljZP%qo_*Ttf{>nMC@%o}!ATQ^Q>$t1-x zr=-KtLz}zdrLPMoYW@|@3a&WRC#I4&2!tM>&7;`o$j z+_X+u(bpQiOuQh^lF+fhUd?UoqPLV00PY}Kc^?@MG(&fLD!_Dk3XCL`Hr5gram?jTW!RbZ`{znCiJFpc`3rGHQ5`!>1c1{%_O`uL0Qsqft*;hIQSxr0I)E;-y(Ta`W3Umm|a{g+}5!D0A;5>!u~jeWNyvUC93egdA$2!(UnbPM#u!s;TP!8t z6qpi`q;f|5{gBBwA(@W*x(BsFU}X^=1KvHZl1yR7^}`Mc*tK6o*i z#M%ANda#Tvp-`LzB91Oo}`849ymYau4eN#RxM|j;-rFqUqbvnSsA&%MQVQSgr!Z5;-*|JNSx}gKYduD%{_(vqX|j^0 zm*qm4y#?m^tIGq>F$Olh9qQ*7$yL2&m8NlC_$=qu1q$ zr7tkqQ&Z0udhTiAE^6t^>H8SAxq6vSDmUi9c@dum>N`RC*@3g6kMQ_}0IK3fDo^LE3U2%@fCL5X zw&C#nL(HEV5`#o}=FfhYI;gSc*Vt94aL0A&(oc(GSI>OUVTXQ0Fk%Az7LKz~76P~V z!-0uSc6tsdGur6z^!?5&hY#l5k5R3gP*gW51h%j_hkvo0H5l~RWJtUe+98^1vc}JQ zqj~Vvs=hFP`Tq%!SpB>c`7xN`~IGE zBr5Ye5EH`CTu+0yRR9*u?)qQCBEN$A25p7li#{EmSaXnasvB3Z10s4-Oc%ol0Lrvdj&(T8IdMoZ|w zz^x1s$Ul+TV`XfP&_ME9p1j{@N2mZdaU->Cn)uQBr}J6t6bqbB=6nUtpaHUma1-{5 z+*=5q5RrS=IzLn!L9HlwDFZ%Me-eP_)wkuHqblFjv`IVaOgEo-n~2DgYH~IKK4|Ek z*Xc~i0Zx0qbb$KdjJ{zFdC_e33m1if+qe2Xv@{&)UEOAbb%5CAPDn^$L75GFI3 zcuH6%-`;{e9^|I$-~v#3yE-Sx49FmVNGB(Fr8AGR@xBh)t4~6L{e!zev6vB3CyeYX zARXdui+ae3Wlt}FOC{q?3gnC`FM*`X5;s-O6&ic|@Mk0R$g-KDL~s9TiZu@-adQWV^g)1kMWrr^gnuYdEDb8Bsy8 z#y^~mM8V#Rho+&MxK`TDH=_DxzthaGyHc-1eYLOjNFrnqKl}~&Xm0li3wPr~yh99* zALC?XH;`aP(esEpUZy(r`IvB?DlBH4Q!SVnH7zPuZl-M1C?T4(Hb<3mln3!Twgn3d zLC^8g^jPmVs)+EDT>G{Z;lIfRKvXXaPBj~vWnwN81?pn;1XUS+fpP6qmh_KbJry^I zAGHSR-Rf)NW5>}G;GIUsL2Ns$)ZNYUTLUF<|Bhq`+e^jc%j9vhk{&;f>2buh0WFRg z@ca`1;rKhAB}^x$wkDg6IV&Ti*cO;70^9~DtB_$0Wrfl>ZqblG^U0}k>%4VZOyJTD zO&1C>zpsy>#6DvfX11(^yu-aR{|v4?>6Z6a(h1o07FRE6vjbs@w_~?eWQJ`&&X@O8 zwWHXzKE$lGQbf}rcZNHL;f?5cJxVaYu%Ph(DV>CZ|EIY8EDHRoTrd1(X@Wdi8sZy>OwcA$-r`$%e~y* zxAmg+Q#y<~F4TX;)br`xOH`)mghO#vqPD zJ%?ep-R8#5lG(_K_B$boSiq@6?mSs8)mkp^O14baI)~_GF+B5xf0oz#EbE3`os7#) zi4hUsBe6gZYWVrF^k4;!MZNrs-fq#H=N~Nt2Y-O%obdnfZW`nEc8tTiftr9NX>yEC znu#p+dARGO8x2(3CrV?$3>NiWI_>oLEDEKe6(ObmOo<{oyKyk0bMiByrf9pD{hDQp z&8sv;2gaVL*IlCHh1Kg_7rVp4qdsOfO37Wlf8^gQw$JTxHCbhoCXyw45051>+m$ZQ z2=1CA2P{L4LyQHzZ=q#R@@q7$3X#VqwZZma1x$MtlX~F2rkv@F3?^?8%u0`KKt@iqz|6ut-r0)Km{{_(8)*Cb+feou4&_T4c^Yel;8Xz%kxh8qI%hweWb0oCee`g9m)`SiJ- zS6xrM8Zz1*OzhOc!V_z-h5^M%HfiXA0AAJ_2X zgPxper`UJNpO620zn}#BY2~M}aKk=!+2#{mu59S|Y}D;4cfXO&pc(AB;6(6?{v~+(N=$ zw^~a>4$UW<3ZHDS%^nWAMe_9+zWr)($WZ*q{Y|LS+Z3zn%h2bkZ)!}mTbb0hL;~%> z?nt}_Zgh!j)7!d_;&vU#4@R+>1FEvm&^7BSGhNkWIQj$`p~8!ai`7lZ)euK5hh@L7 zp?vk0E$>w9|BCXL6Jfq+jvQ~uAp3B&ex|-iNB-wR&-(}t6BQGc&LDJ5wVu=G3eDaj zKB^o+&pnEe?g*+UVzHC)rKuc|DC}KbhXRssoMe{z3a^2l?)TrPg4^qS01dY;@QkL1u-#A%Ah{W%#iU zXdY_gD2iwn0&~5)?#j!WRJ*!Y@+NxT-4;m?G?(Mgqu)Nb-iv&`={>d55=VHdMpJ6YgUuFJ zlT|rgm~W~8&juR(v1?!BqHe8Lo;)>rqE25mv?D$SNgqG0h=V)RgI3|~0w)jUHrg=P z2$@g!AVqniky^{3!~cwDu&upey%L9z)$+<5>Mc1gocZP*2K-PV$-A0!4QPw_t2%|n z!5s`G1hL=3#B#_5SZSClrcHq&kxSBelp#tVI4Gaj7`JY1XgG5$#qtUxq9BKG&ZJ+6|{HpV#SC z&I8omP|b4a!>01GeBe#I8GGMdQch49ivhx|i#p9)bE#4__-D{zV)C#RK!pQAbElT1 z+|m~uL#CQ9yRD>*6cBN*bHQfNAjP|p=FWR-1rl!2n-noEUh}8MD`@1{Qx2hTXUIAn zAIW}+Hsbt3ChCn{{(1=k3FYH&3^LMOlk?4MDhcH23Tpt@WJ9W0?!f(i`3$Rm!xA%& zQg~V$WV2w7$|f&jZPQ5g8bFAVh}et(C@|7$Ca4AX4&Tg_doB2muWa?#6@*sO59zrl zlEXH3&i%Uhjx&psHZDZ59dPmJn_nJBfD@CdZ~+u|&-I-*=`>yjo4vU`3K?sy=1jzZ zl>Dx7ry)%PqMaAMNv8xdZfZ2%hgd4cz}q`kDQW2rn-?i@1tnq`GIF>o|NdGuR?|n* z8@|0g??g9M?6RrhqS!jrS#jf$*zuNa@{0<$Zw?&t8EP9V8!y)TYK&z7arQbCxx|KC zTV7drpxXxn!k88Ai&_2h8-Q?hZ2W(fcMr^!h3$g(!;Wp+wylnB+qP}1W7{@5NyoNr z8y&yoff&Sa4uM~&wRK=DNK;Nq~O`ACcM9@jgl{KfV^k|wgA@_31Dytef z!uj4cMM$#Ercg{mpn5SSLD*kpBxy6Qk-CW`QYcJjSd_~mJvmx8aLgA>jAyZ|Z(m1@W(c z3^i=wq~q}no$&KqUa3QemPG~bmM7;=FqG24Ll{hR+3`u1nf_KCqej-LwtVgP(c zi(!l~W?zV{KfuII?*eunJE!O|Nlja><8{B0NDR0=21AT2JHXaMC)-Q zzSWaFhR3A7yD!LDs$oZ3gS;@(jT_Hh(!(nK*4XFFs{{2}UVY*u(Ko z(*zL|RrxXVi46J}ID=1i@a1DnGimOM``a`YrF3^NHB;%WAMe(fVaDLGXO;00ZXxg# z*Hj_xLlOj?k4I4ZPoh7bLf%`jyIj>J#HNM74EEy_5e^fpKa0{mq`{YfNPnv@oC8xjl2zt$J?Bjqk+M zhEXo8h-MypIQ!Q3kj_HlB;ta&Q%)kjAxW(4(lpjo&7D z-kk1`tLY?=DL^WE(XF}eDbN@s@)w#H8S7xC>w6~SjEB9#@4`eG_;V$8drZK^(&%t^ z$0Y6-!rbdw-$AAbeb9b=_zB_co)3xlWkz`b>*Ylw9x+_}`4W7W65bGiL@H&Y9owrg zm6>tIF=4(U9At&XBeQD^6O=s_>BRdoCU4m6t)^mfM2p8mFP@h5gmJG7lTHdK+*5$F z)+YWenMWJS@VR)Iua^)4T1R-!d1do7^!a0_o))aB@nC|s@WY5Umo@_~7q+5-O?)Wg z0lg>Ckg(^&cMkzOunPKz+N4U4Mzlqoa~hOdcuXte$BvNMfrDWSGEk%a6vVO#sSpbM-yd)>yQ%np;fmWp_`6IYJ1m*>2Cl1H0hdwWPa zpG247?XFKD>@-_bonDq7f}>O zN&T>ar4_vSQXOk%i$qAtMVeZB_0}jwJYCHV95sFL2#wE zp^);qF^jW6N->*+m0+>5;MFLA^N|3rvb)_q1eOHPpJ3+OmVj(&usPL9>gZ)e%*Q(O zhW5FhE?8wdzMLanoQ$3oQDnXMFpbix8x^+K>&nI{uF(HvYJ;voTf%4C!bVj_OU4CX z;?+d&-=7vR?kJduSb#PGAFT`0m_;f#f&o(WhAr(>IkJ{+dkPB9Z=D`cZBW|&Nsj#J z_w(jeRa!jq2ghGA$U$4L*bgyhhxIMxk1?CF`+^p^Sw&lUb7s(*ysIx%pRImg0t|Tg zl8D-)xGBK=2NXQNT)jK_Z&I0e$-@pTK>sBV&kg6Hi0ombFXP*DLGr)f|5AL_v-75N z%XUgCgW~EbnxXWt%@!fc&JC|Lus+d-$R+*9Z_(44!{Fl`&7@n3$MIIY@G*CzHm zv4r?JZE8@M6hA~~V*j+AjU_Wqn?Z?D8sVDBz;{vaBG#>%Zfy4?vT+Y(-{jT3*- zaJHm=OY4$AdTbj(P^DBZe#x2zY&n)>U_37)k#HCZKJ04#dpCrXh+g19THzJ?zqDu|U8nf2CL|-F@ zx_`IWbR+0@ljmi%hgB3*=$RCX8uFSf)?Zb{6le7BG!v4hl{v&Y?X{`N@hHFjFM*T3 z1&A!J`Y6-%--9jjY_D**&EIasRoYGV#^?BTaf9OZ*P-sYu*C9r`P=?=fC&+z@OF(h<=geDy&9t z8J+0oRuS@R++!-qX0%)>Ha9~tA;=%IUqRSjHMpx5OSU|#*^Bh2l7 z_v;5;R65mRU*|%^mnn@Ge;!ra?xPwRd zA!y>=dSUTBBG=s-Wq@d08FA{gX_r!*MfzsEZM@Gq>F!dkbs2Mg5ZRBu4xM-`b>2VI zhK^69XcthXGK3B)!Bv--Bjn93LM}Y?S|Vc7yiM`V-3hJ-rY^ zeoXQkl@<9Z%I`|Vtwgz+Y^1zkx&(TLYIwjW9-PMK3T&H+Ewtyf=;Bp}vKw@1-{;3B z`r8QhZ6heXBqw0!Op%V$5~cJ9&mYp<9y4myV@OXEF0@3_o@zs<1m2KGh3xDjN~)wp zs0*g?okJhljieRWuCj5(+HSAy&cY|SteJdlsqsA;3`7kWLJ}z zMVPc3F2C~P(v6ECyuuiLT6r>#`@hZMQoQ_ex%kVS&qn!|0-<=MnwkmXBifcKa~TKL zP@**T7z-CtAvf27xxale^O+OQIKjv(`M%%uf#Rj3_N^3|gGRypj4w=ZmL_splhjOq za2aCvqYHK0P1rM)xv)UUm&#}QPYKO5runKHo%1{eM9q7dvzR>-Ns~_7X_CQ5M}bX9 zt<9p1k!V}YFbVsRKH0qpfk=nk@1Ttuk%(?+oc|hkVtyq8jh@(><1&@8L$WR{^Y z?SiG|BieveS7qxa{L*LU*7j6}K2~#9bt1E~)t3q|6K=&Yb}o0Q>|U!zHiYy_wo(`$ z;<|r^<&k##c$S$TbNQm>&7#t>?or5eM(J#;)#biQpn85y#&*mOz8EM!)8`ohUJ$}f zxpw9IVF6xk<6XwDecX-E%2w7`XGuf=GqTj9b&8S`#rr%KAikFKsKvvjflmPdV*7efzojAt0SMy(1oa{ z@jvwSS0XEa7Q&@@L5Ylag{y2@w)!;%s{=z|5AV}``2^qDmqWr71Dh0)ICxasqY~%n z;f|-n6rJ^T*Cc%3Guy8Pt_Uh-NhE8jlEL&s|sS1uP6HIU4c7+sXf(063fT)dYAyqg zt@0$S=Xl0)h|?!erSmv*^E{qGk?HjqCt?95T?NOPHAudqP>ND{P!Pn4O#kjtGO~KT zVc|{aUssQ$bl`)VFJVxgjx0^9ibrK)4f(FS)Lj;~uq!OOGZG8`h%fP(>NoTIipv)X zQ8z0nDJGEBbAkl(c-G6*jL|et{&wCK7(sw+KM**6!;Rg(1rD~to@RW`ACtT;2`^er zQNmhfs|G+H$MX|96m9%b{Mg)BX z#82f8J>iUtAgXt47u|s5}6y3x&+`Rp9gf)z$teExz0*|&~ar+ z6};g*zFgUW*iR3%ty@vcIB{?TXiO2i6k5l@l|FO2_#QnY&zFj|!^u(|3FBhfiiA}o zUy=wf_=o&aBD=f3#UZqPAGwsSro99*JcLiF_*{tR0IgrbJtJ*{i{YKuBTl_x_$01; zQGuB)ne|Gp!CN0Hss zYmIdg*Zx(Sn2}W1+W;Yd``GHMw976TkP(Kof37~NE{7K2Ej?r`8hG95QLl0TYsN#x zN~k~od6X(_0IylbzK8qA5C3;K>9ENQI#$ zBp^c&WV!=BmjschHhTsZ_(ggffxIoEvP2$8H+3~dKAl=#nY}7wkPwo^0LA9WJvJ!6 zsmJjTU4^`RoJpZ2F)2}M2+ud>%!kOVigD`J*%V}18WHx-NXn<*tMbnl&YnC4&zi6I z8s=qXGtwA2fJKMV_Hb8c{CnHm@np~qCHpWR&9=Vo6rYuU&I-;20` zu6GyV2QtQ2(e_Box}Soypr47a>OSf4e4Hl z#K)eLO`5Vvnlxqp0IK!Eykaa1-o;=R;S`yYT#>tsNM6Ibx0ZcgQ&c-BT(&)#3PZ0{w? z{?7WUNCw#uFUZXKZtTn;{OQR~)naPZn8;X~Qc`rM-9DJLQ}*+XGs!_^QKh?*lt=$Q z0+fae`HQvF*&|X6QkD0*SSK=Uc=S0U9AhFhQU_Zp6t_X#9aNqjo-jBh^jDY^m(cdI zaus9N{UqgQq^TB|Z#TyJ$I+5TKa(lJ0;H0La~Le8v2i`KA#Ph~l--H5MnVZHLx>X( zfut>seCq`hw1%z;2XA%6FC?#0TDkr*EqGZA-UqN|}HV6Ox+@NzdPf?VW}%gux$( z-{dj9nj(r765z<@7A#}0em8Fuv;CGB;GBADek#(h6pOonS`>D>iWl8;5SmvB`+2k# zKCDA^3u<0e%H`JF*jpOyub(T<-#ckA!ea*#5xzObGX?Z4m+q+!L$o6>(&I+Gi?vHF z;Yi}<`^?h!GAV>A7DOh{*{I(Otd#y!YR_PB3k!}+V5zR90a+p<79WT^>#>TJEVh2H zpXbDo^kZd^STgNnboU~0=;oWC*#+s?*>Vizb?ouS@80HU3!d7teB<6=^IF@O9DO4Y zqN}Qf8k$tL9!)(&kvy3S;RO9$hblaye&B=bpuHl+MN*<^sl=>ouVulH>j|aK&oe_E zx(_Pq@hP*(EJ%`q3U4(?t3+ZA=F1`a=SrHfM|S=QDKg1P&yN|?+C=*ECC|qEZ3tP4D z8Zs{vPRd|ZGM77)n+@{*lBfjHo%xn6oxB-S!A_8nyn(!`Mc6z^coEHDFE-GqR?gC6 zh-&6Vnv`XPPrhtUvk)WsQS+np8|X6G=Rn*n0tei-t-`hKx406FYh)J(X~FgQ&?la? zzeT35Z!*I|7O&@wx<29GD7CG$r~+WWn|;I(8#%7Q7=GsH<;tkrzPVrKDg+E$y&jgK zmXo#>2&X8OT_!lR6Qt!ZdHz9E#YR!r>Y&IAVQ2iU)xj*R(V`EZfjB=t9h~^m4o55_ z0+uzz>IOUvRXyS~Is~4a^L1y=VRe4>c^b82DUGNa>X7nGD}(Ya`3InFETFxhut97+ z8Pg^4Q6oxxl>3UdQnXWsgIIvO?U$FsL6eLl4p)Y5HM-g&8%`CMG#)O+jB#27?pwDR zwOgn}m$xMkC|uu{Xogn0oKPHeSy@jd^h@v+`BzDBId#Tv9>CZf&ML$wlw8dbgF|Yv z#Kz290MDEMg*^00PEDjCOshwAor$%OBP2#du(>qDAcUhpGeX|zl-bSoD;x$nemj!W z%jt@*IXxV{&NN_#O(|LRUB|gyc6P16Y=}Z4Fr`G!!LyN(pm{^9EvoQ+QdG zxO?UuTE(hC8|^^{UH@D!0?9JjdD!tL5&a8=Zv$Zx^H3OIvXT;jW=dv?$k|EA{?Ng% zfWlK8i^6;MyPZJ4FhpIh8N?9rNJBqH!-|#(3~aW#CJ{lb*R5+Ho&fp5ZL~x7nZ^wr zc2T96eOUL6S=MJ51c-zl1JM7iF|+P5e5PI%*Hj9FVc2|DX% zyF2m9y4hC*R@>F8TG40@3!El+pxmw`zpZHnOb-tN=hB{m#Gn}ar?}Vq%Y%pwWXY0o z)L)*63p0c>O#d)%t=LfHK}KOWs0ZobviTV}g+II04l|92>Xx7{6nWbyHt66dl6}(s zslYOQs+RR(_2~y+M2(9jUh>7a2QPsyCWH0?dF+(T7ZPA{S>n0^3V%c*5>Y^=l}D*m zdTsI=VwKsi)so$8YhS0h1;Nhw`{#>SviLl+;)~^1)_!tX5@wlO%_}De9#X2C1os!z zp4G?P#Mh-3ZY!r68|g`|i@Sg*Z%=knGzmL+u*kK|Z#v0Dkt{mA&YMzRHc}3M0|u_9 zuSNI0JJl;2CO-mD`D;om&>2Jgr?(c`+);40)-XsRI~hpsar5ZuK9e9 zKJkP_YG*H0EI&J7FXerrzQTio)FJ^qQa;j7IOMvpV9&Hk%e*Q+e z3n8c(B)XzXWYn{2tZ<{a_LB0f)WI4;tiV!R=55i>bVrc=38Te7howS!kkTt-xk+9# zwl-sV*=B?>2(gx&7ba{k=895oiMjaLoDd?(uXXse=w(8>1Lf4A6x=TyrTPg?3ulLb zL%F7$&2*Y!n|zyZP8Rp-BZj|}*N6iLFU5^{wm*9tob8;H?hJZjW&e_gfRs98Epf|#YZ@okM2#=w^LaD7T&?j+G`4UK$*?g%A!xoO;|IXQLSBf3k?ST zWGVR3KHP`A%JQHAU-yb^NIlJFzau}-eq`TK=vFX>QQTaYp5vYbC>ktT>N3{VMjLhv z#vey&N~Ax-;JtZ^?h+tK47F7Ui16^uUh+iiJkNf%D%3M;5(;FYNn(a43UR=BJcml{3|2o162i=fNrR%s6g2OJjEK57qSTH|xcB1O*s6HP(Yc-34jj_s z2JO|wZ>>h(Q_l(!)=P~b0u{iJ=8IH_7p9*(1{H<#FTwNw|kkFVm*t zVx%Wfi$D&+I4c47982{E`UsJFg;TTac z_XLUou~bWbv=6h}TR=XhlTFi`R~|OA>PViA`s#dt|8ks|rz(`1S=^lWPS<*wgPs z86nNBs;zxUI>93lLxQ8~)X9Xu@P2RT@a`mGb^F0-4UO~ zACl>FAYe&zHRnq)nunRVTqNpyyoTaTlmTA_S_hN=#8z?3_t$8JH@BMV^fG-u`EMtlYG zA?4=)^#5rK0y;&>IRW=S;&4`llYsue4j~3h%&NbcA5REA8^&3KNyTi?FP7+C<; z1?9~-j?CE3Hqj#Of|4l*JnI%j6>?xF;X?HvY*95#43bzOVEFgruyEP_-+k(+2kxR3 zT}V?vG!_<+)L0Gi>scET+dAj8zI8XuunLK1BJ4STQ8pmr52|^TiZ8WN5w32Y#N6?;#|d~};>p%{ID`6n`$#u>lGJQU&%YS99j3NqNZ zGmPGX8`*0A*pG|Iuu>y49Y0RM9EMw`^IHu*IGI!r1!yEh`0X7MooH&Y*nN`JkAE$Z z8x(aw?~d2Nc8n1e=b*cx(C1X+ZQeRZ)k-Wo*llJy_WTQJ=(i25{77;^7=|22Ljn{| z6hY8-{|i(b;~n1zCrXi))8$k`?_G5MXI#R_NbVo)7CxA$yC(z*&qh2IKQEhF;zt*= zu2C%N^u5C6$%NB1xO_~P<4yEz6q+lYjoZE2F>`gF>7WiW z%0~8)%7Ic-lpP8jhf2?_GeIyMAv2VKbZ`eP+yDxhQ*N;kK= z#;@XjBN9G*nNRe1H|)YNNSIWXZC08pPZ7O)$bv&ax2+Ip<2{cI#UQ}S6}dffqqiwc z9jP21>Xk)#+&bs}h#jj1q-5p#0fjl2uLBpZZ}9m5MCI%MZ^8x0n( z)GGNbA}{1)kzQ332FH9LjzTBPW@ zFj~yck(q$HL@9{liv00nMlL_3jhJxHizYzPOi|=Z8M)L5H|MIQVY7SfOS^WWRIgnQ z&yLhc4wa_WLoTWetyu4Q_bw%`sgdn<;`=X zfN4uLeR{hQ*WWim-`c*mA0Z2)fiy~Byu`z~B%kO^*@>dJNtqOk{J4*HQAxZ!)&viY z+FYsp44#8H4p+X%P&9>=#-;B-N#`aV#;E`$WjL_rBs$K?m2}K~W2#wFcXc;|*vg|W>=0`x)$l63hroZkG z&`OP+qUZZum5*(8<&4~wFZcZ6#04~d-Ep|a9ZV&6&uYC9%7-gK@Vj12^I4XljS z)=?}jEuZH)J;(++v*w|a)AoukJL(sv$_54sLpoqR6bG04lwGRq7T3la;o zIllrGTIf;t@_@}0SYD?pan4AK4gUNVuY4xsNMOp^OD=o|J$F0f0rZ+ML(Z3A`(#0! z0fsRD6L#IQRVh*vLxn5igVAVoruXbb%^L}H0j_)mqf?*Nx8#E2yv81JxOYh}spLmo$SXu&i>>OK>*w^A*6WJeRasYOs5Qmfkq zl6JfYZ@n|LCWxNb!X)15RfU!W9$wgrx&XDE?QuLTN?#9LQM$*T2Zn6^1xP*r&HWe?&;h zA~Rlk4vTawF2#%B#iX43@G>J7GMf~UN>$P4x+gz$fAmhWFNKUR5Y*~(&I04p;0Pfd z(8UG}YB6`P#&_4kTLS#2&MXdVB8@LZ3t~kWC+P1hfayMtN>gxON1X|72D1 zPnj_B@pMcj=7qhf;@aKli#l?gk>rDB3Ur=_BOvuQx|uk2FjpjuBV0xu+A+=BndCbs z@?)7+vlduubo0G5+nqmwHnzXO%y+$8oZmnxtaVET0@(yco%aMN2GnI1Gku$DCZ z>>=Huwn|eDeDaqExowV$5=d1n$#DrUXBuCfaf*A8`m*7!z#>835L$()pS(+K;$aWH z1?0nlINWQ85H49hPRxu_arP96{!j<=sCdHV_X8*j$uw-f6>Jdg>S@w;(F6F@4+Cw3 z;dxqM?|lbu)ebzzhozLr&0yQb`Aw4hl0@2$Of&~qs%L?q5RD)Xl@=5cGt>Eh-TxYPjFTlE1F!z%$N97Vw|gD+O`r8|rWP5--d^jE zgY;8TxM=prN8rayMdmMRPbKrK(3tBEq*YJ~MwevCCR11Gj#ibp$nmkmCY+uK9q}&5 zy8Q_c8JOXW}DCp$fngK>0QV%U>eoKBOgUpp1_ z>UXNEF&pDZ*bi6L>9xZ6Iu`eR6!4l3)_a5oD7&n0Fe<*EkTeA|Y_VtPBVhJ5)0prM zb$r3&G=7E2nhII?-m5SO32o%#r6$fNQhuP=uOk)79xXoZDK%TK#Hy7E755-vZga%C zaS3Hz^Nnm!Q-rY{?|48z-}V&a3TewydzAwi@}3H+V3vXj;QlsLp_&8yH&qFEU{L1` z2XP(*MY4eP|I2?Hxr*6sD6{zEu7xt+-7t`*L!<&!*Nz|n_n-S8t-3NERe=9Se+*G- z|BwF`0VHB@qNXV)d?<$z9%O9$hs1ZFfS`q*SPbC5RWkd1q%*<;{I9p}>-MaF{I`sX za)3h*CYy<*U} z@^8QyV8$HD=rbdXj%Io!tk`Kl(31qU9Vqqt!HFzX*Nu7(T(?*A=k zywkfisMw5_{DIzn;KLbTB7oQeqk|M$QD<7Z4~s~M`rxSVkqq$vB5!P3t$O$MJdDurOHEAw@&CMZ|F8Y;l>gfQ z#xri!C}sYS|F#mzTAu^(-`JcNh3fzD{~G36SiCWR(LduLj^KFIJ;fxWB@)^vEt>_} zqa-&Vem21=X8?SWiT7IlkSCJuZaWo#|5ws+XhSu|5Agp?Xd)d_|MCCMs z`mNV~r51a?cj+)k${N8H8Cpt9(*IZgTRv!vzgO}wtNi}xKm9MUL1#L$|E>Q8*#G-q z{%6l-PQDxgt&A}#mNXHMo@oqV8IJE2pCOoxUc84V6KFV36nx|Qns-WXAJ|a2PbhpJ zX5+ta;Q{z>9vRLM_f(Msf!{;+2Vyw?_>Z5|zVip00o23cIyLh!Ts_ZSFLQA?2%Hnv zJXVgz5l&g}|LMP@u^so>0Q!H@y!QD}|M-u@BtT?p&J*fMS12JnzO`r^pVmMp6 zi9SIJ+6Cu!DyqK$=byY&!|ziWRlO_>VZd>R@sI!N4XK3c>HUhGvLh7Z?+H&65$0da z>hH4X!Q8#%uUT24H(UVlAKNnlRK(+g<{hI^&ZO$r|6*nT=lr1v;`?1SYGi1t@XN0b zO&=!ceQb@{>$p8pDUTT_w1sSs>;V3!;Zr6F9VQx}|Ez3_ckJ|!{~2^d?5$62$FjQ? zl4~?{rniFQ*Rrtmn854LTC7+z>+)Ro{uAJT(q5vJpnOqzK)dw$r2x+VfA>GlR6kL{ zU!GjzuqJ2U;oJ0WpPeETv1TPV= z<~m*a1&;07fBa7~rT^}KruRLER+Z3tIH;i5pxGmSY*0y(@(Ba_|6lhzfcZa6Jq;`1 zYh7d@vI?$4*6V-#PocnB$7%bRXUgK5jh$8e%dzdw)8cG@p|>27Y!!|p&`MApfd3oF ze%?!pkY_8PRD+4JZ2OP@yCnMG{?~u^-&(?$er#M^pXoSNJ0o;5ZB|VF=lhR3ceSz~ z;J?shO&H44vk?4} z!T1GW{(1fx;r{pM-_X-G8r4eeppIwd;QDVT;QaMGtN{M2nB%Z+I~Gd-e$_(KAW8T? z{wslE1Tjv)fcA)l5I%DRKE^SctWhvA|3-ae*49>KlDSP7` zp{cG)s%>;DHP?9Ceh literal 0 HcmV?d00001 diff --git a/src/memory/alloc.hpp b/src/memory/alloc.hpp index b869a68..bc071a3 100644 --- a/src/memory/alloc.hpp +++ b/src/memory/alloc.hpp @@ -153,8 +153,6 @@ public: fixed_pool(fixed_pool&& rhs) { this->swap(rhs); } fixed_pool& operator=(fixed_pool&& rhs) { this->swap(rhs); return (*this); } - ~fixed_pool() { clear(); } - public: void swap(fixed_pool& rhs) { std::swap(this->alloc_ , rhs.alloc_); diff --git a/src/memory/resource.hpp b/src/memory/resource.hpp index 7469da0..53de231 100644 --- a/src/memory/resource.hpp +++ b/src/memory/resource.hpp @@ -26,34 +26,50 @@ constexpr decltype(auto) static_switch(std::size_t i, std::index_sequence{}, f, def); } +template +constexpr void static_for(std::index_sequence, F&& f) { + [[maybe_unused]] auto expand = { (f(std::integral_constant{}), 0)... }; +} + template auto& fixed() { static synchronized> pool; return pool; } +enum : std::size_t { + base_size = sizeof(void*) +}; + +using fixed_sequence_t = std::index_sequence< + base_size , base_size * 2 , + base_size * 3 , base_size * 4 , + base_size * 5 , base_size * 6 , + base_size * 7 , base_size * 8 , + base_size * 9 , base_size * 10, + base_size * 11, base_size * 12, + base_size * 13, base_size * 14, + base_size * 15, base_size * 16 +>; + template decltype(auto) choose(std::size_t size, F&& f) { - enum : std::size_t { base_size = sizeof(void*) }; size = ((size - 1) & (~(base_size - 1))) + base_size; - return detail::static_switch(size, std::index_sequence< - base_size , base_size * 2 , - base_size * 3 , base_size * 4 , - base_size * 5 , base_size * 6 , - base_size * 7 , base_size * 8 , - base_size * 9 , base_size * 10, - base_size * 11, base_size * 12, - base_size * 13, base_size * 14, - base_size * 15, base_size * 16 - >{}, [&f](auto index) { + return detail::static_switch(size, fixed_sequence_t { + }, [&f](auto index) { return f(fixed()); - }, [&f] { return f(static_alloc{}); }); + }, [&f] { + return f(static_alloc{}); + }); } class pool_alloc { public: - static constexpr void clear() {} - static constexpr void swap(pool_alloc&) {} + static void clear() { + static_for(fixed_sequence_t {}, [](auto index) { + fixed().clear(); + }); + } static void* alloc(std::size_t size) { return choose(size, [size](auto&& fp) { return fp.alloc(size); }); diff --git a/src/memory/wrapper.hpp b/src/memory/wrapper.hpp index 55eab36..8ee6492 100644 --- a/src/memory/wrapper.hpp +++ b/src/memory/wrapper.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -80,6 +81,18 @@ public: } } + void clear() { + auto guard = std::unique_lock { lc_ }; + std::vector vec(allocs_.size()); + std::size_t i = 0; + for (auto& pair : allocs_) { + vec[i++] = pair.second; + } + allocs_.clear(); + guard.unlock(); + for (auto alc : vec) delete alc; + } + void* alloc(std::size_t size) { return alc_info().alloc(size); } @@ -88,7 +101,7 @@ public: alc_info().free(p); } - static void free(void* p, std::size_t /*size*/) { + void free(void* p, std::size_t /*size*/) { free(p); } }; diff --git a/test/main.cpp b/test/main.cpp index a2bc740..ce046ed 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -32,6 +32,8 @@ int main(int argc, char* argv[]) { QCoreApplication app(argc, argv); Q_UNUSED(app) +// QThread::sleep(5); + int failed_count = 0; for (const auto& suite : (*suites__)) { if (QTest::qExec(suite, argc, argv) != 0) diff --git a/test/test_circ.cpp b/test/test_circ.cpp index ae7065b..6611848 100644 --- a/test/test_circ.cpp +++ b/test/test_circ.cpp @@ -8,6 +8,7 @@ #include "circ_elem_array.h" #include "circ_queue.h" +#include "memory/resource.hpp" #include "test.h" namespace { @@ -223,40 +224,11 @@ void Unit::test_prod_cons_1v3() { test_prod_cons<1, 3>(); } -template -struct test_performance { - static void start() { - test_performance

::start(); - test_prod_cons(); - } -}; - -template -struct test_performance<1, C> { - static void start() { - test_performance<1, C - 1>::start(); - test_prod_cons<1, C, false>(); - } -}; - -template -struct test_performance { - static void start() { - test_performance

::start(); - test_prod_cons(); - } -}; - -template <> -struct test_performance<1, 1> { - static void start() { - test_prod_cons<1, 1, false>(); - } -}; - void Unit::test_prod_cons_performance() { - test_performance<1, 10>::start(); - test_prod_cons <1, 10>(); // test & verify + ipc::mem::detail::static_for(std::make_index_sequence<10>{}, [](auto index) { + test_prod_cons<1, decltype(index)::value + 1, false>(); + }); + test_prod_cons<1, 10>(); // test & verify } void Unit::test_queue() { @@ -269,10 +241,9 @@ void Unit::test_queue() { queue.attach(cq); QVERIFY(queue.detach() != nullptr); - benchmark_prod_cons<1, 1, LoopCount>((ipc::circ::queue*)nullptr); - benchmark_prod_cons<1, 2, LoopCount>((ipc::circ::queue*)nullptr); - benchmark_prod_cons<1, 4, LoopCount>((ipc::circ::queue*)nullptr); - benchmark_prod_cons<1, 8, LoopCount>((ipc::circ::queue*)nullptr); + ipc::mem::detail::static_for(std::make_index_sequence<10>{}, [](auto index) { + benchmark_prod_cons<1, decltype(index)::value + 1, LoopCount>((ipc::circ::queue*)nullptr); + }); } } // internal-linkage diff --git a/test/test_ipc.cpp b/test/test_ipc.cpp index 04a86ea..bcb7157 100644 --- a/test/test_ipc.cpp +++ b/test/test_ipc.cpp @@ -19,6 +19,7 @@ #include "ipc.h" #include "rw_lock.h" +#include "memory/resource.hpp" #include "test.h" @@ -419,43 +420,11 @@ void Unit::test_route_rtt() { t2.join(); } -template -struct test_performance { - template - static void start() { - test_performance

::template start(); - test_prod_cons(); - } -}; - -template -struct test_performance<1, C, V> { - template - static void start() { - test_performance<1, C - 1, V>::template start(); - test_prod_cons(); - } -}; - -template -struct test_performance { - template - static void start() { - test_performance

::template start(); - test_prod_cons(); - } -}; - -template -struct test_performance<1, 1, V> { - template - static void start() { - test_prod_cons(); - } -}; - void Unit::test_route_performance() { - test_performance<1, 10, true>::start(); + ipc::mem::detail::static_for(std::make_index_sequence<10>{}, [](auto index) { + test_prod_cons(); + }); + test_prod_cons(); // test & verify } void Unit::test_channel() { @@ -518,9 +487,16 @@ void Unit::test_channel_rtt() { } void Unit::test_channel_performance() { - test_performance<1 , 10>::start(); - test_performance<10, 1 >::start(); - test_performance<10, 10>::start(); + ipc::mem::detail::static_for(std::make_index_sequence<10>{}, [](auto index) { + test_prod_cons(); + }); + ipc::mem::detail::static_for(std::make_index_sequence<10>{}, [](auto index) { + test_prod_cons(); + }); + ipc::mem::detail::static_for(std::make_index_sequence<10>{}, [](auto index) { + test_prod_cons(); + }); } } // internal-linkage diff --git a/test/test_mem.cpp b/test/test_mem.cpp index 6f96b3d..348c4d8 100644 --- a/test/test_mem.cpp +++ b/test/test_mem.cpp @@ -88,6 +88,7 @@ void Unit::initTestCase() { sizes__.emplace_back(static_cast(rdm())); } + ipc::mem::pool_alloc::clear(); } void Unit::cleanupTestCase() {