From f7fe64f386589b889092bd63e5003a0cf475d5fa Mon Sep 17 00:00:00 2001 From: bloeys Date: Sat, 11 Jun 2022 05:00:40 +0400 Subject: [PATCH] IsEq benchmarks --- .res/bench-is-equal-10-million.png | Bin 0 -> 26069 bytes README.md | 12 +++++-- nset.go | 29 +++++++++++++++ nset_test.go | 55 +++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100755 .res/bench-is-equal-10-million.png diff --git a/.res/bench-is-equal-10-million.png b/.res/bench-is-equal-10-million.png new file mode 100755 index 0000000000000000000000000000000000000000..671d2659ade7db8e2363be286dadef7226349758 GIT binary patch literal 26069 zcmbTdc{r4R`v#m+l%!H9A`;1#C6jfMgpfk^B_U+rw=olC%a$d|He^foeK*;6V;|et z_uYswW_xda>-#*m3JA%Pk-OVsc`|P=+Q`mY8xVd7QldI5f^?hav59#1kR*b8oLaHobW1b2IfB`B8%_ zptuFZ{MYSoQzoh}(1XLEY6~cQIXlbit(JCyUfGYFwaqfE&HfT?EHW`jQDks&h3rT~ z8nF?FN3+O8@e0cWl3iD8-M8Bu{~VXcMdCw(M6D-4+lyj(Bu4C(a@jeik3qi=QCWUk z`Nw~b^h;%;S1$cIBA;CO|9X;pGb`)?8vS6E3oKYRR>Jx#`k#Lu6r`Bw7jSi9qXg-U zu3=kS{_~DFIBG(G$IW`;>6m-|y}DbVwAaBJN%xoD-JgzaNi#+svsEhv14a2AapBcJ zk^lZ(sNQw0FHV%_|9zlX2|cjWPEx3fyoGeB^TzJN5cn4>(tA*aoc zU2T<6;!%y;<~R=FiEQ*2tj<~@wUTedarqb;CP{8j7F52c+nNJ|oALFMt4B9r&4o8i z+l)r-!gIlMIv144&R*t=G!B+Qa~-C>J0b+|3TzjvGm zuE|f!-}mIi$A?#ClYOvx&WuJL9Rd_LMW6&qkjsh#+dB>-6H;8QGiwA2kferGuU%=rhcWmbc&u4_YM`xTfJNVaS*5CfB$&~GPQ z{=086N>@coN6ge@a2{z}wJvJU9$Cv=EIk^GLJ_Pd-KY839&r3L;~)4W=3}{&V(NoJ z85EI(w8IX3a~{=jF=H$Zy{u>}U$;n-?t5p!6dcZc7maJNVFC-~sc#lQDk{_u;{L`qr}9-%vs_7oooz;Zm6F#FA&*gN4=;PB^VNrQ zFX}_?n$C@RKok>XqSZk5;YQ}IM;24iifvZ?jiUXPcx$ysncj9eT6qNPE7pW&gBUN^ z*GCngIO5-|#j#kTfHXpbLySPd52IY!Z@+8);wB}HO^X;gd`NF8&cIQ3I%OribJX2M zsU^*sb!st{#cDw00xMeYngX&FM>ANGNR`A{HHQ(hTj`r6-RDO;oqZzKf-yChQ?5=o z5127zN=)PPETpEWR84TBobV7XlYTimB471kyVKA^)=u7^UHX zPj(rUqtsmem{7ZX$_ft&doD5P4GQ)F`kQmaT<%q#daHrG=NC@eq_f+8Np_u-!r@2@Sxff+Fb|xj&KY1~sBl&UnWUT9XR;ehha$<`cw^9w_)A|8J zG2(Byr9;%qM7tMCFJKI!L7HiP$;m3pLe-m_^fDGuOwdm6Vur&=dM3(pr*XM!wiP{F-utntxpl3V;iV)&_}fE zX;&nZ+_$tRfxPU-okUo){CkZc&FiOWGj39z=YCe%Ky?mCc{8j@dxiL;$|AeQ=3TpI z#P!PX8(8dK1jrWS{5K6}O92;?eG*YWaGXQyj!Q{8a{<=3F^n1Xgp3}R!Eekj+t<}i z{#%mLF&n?j@i&yX319WURfwLC>h6xlwxK=JGuZy(~Nq!@hjF(!?$4T$}tRoTG zfk$Q!P4cZ#b}~0&1!05ISONswNQ1;7WF@KxqKrp`Y*vDy%t z(`1r6+w-HzWtnaLq9Uk_H;G{JO;hsM<^(b;FUNZMt@Xr_c~&Ci2NGog-&{F2k)zE9 z0#QFRg6!ULZ$KC?NVu%bh}lnV$Pji;!OMZ-VfT}f>PR$}8`B|-aaxE}s8It_tJvrPO$O|*`{Xn! z3*dfCQ~BVb4RP~8a{o3Y=~o!T-OwqHfO6`sP4+9$IiRa=%vJEz)BX)Ab!fIz*EhY(FQ;U32hzaP7xD?wPdjO-tUOH^CPD-x$$WSxK|+Kj*%G zcZGkx-mT@O%#FNlsKkC7EnF`7OEL`VtH0NO9p35}KzW<30J)q8PFNc((61N~v`6I= z1#loTVHxa`5?LCf#3aT0I382v#z?&y5EeIIfGS7KLD+S(M{q;{~EzE!&rY}afeLyJyq`ZeM|RxQSDB5j&~eX~X- z(EO#1RVTL+P@2AJuVU>dzPm2ZN_$n0VM&c)_|{>l_t}dju+>gg>&K?PZDrQr|4JMx zz`8MThER?0Jz#X-X)q*6@hCRyKvn=00cUP~VwNb?T3=!{^Ha7TR-#{psaqMo5E{|O z1YuaPUhAm)>gV0^_O{M>{}?rmfi2^`-j5Z`VW&Irc@yQQ&-Dw9qr9m9fc79o^PKNl z+|P--u<1Tr(o#XKE#;ub9A z&y8%~`mEj8m#kwm2V-VUr?8%7EM~9_#aVc~I=3?Q6r`-;#rp%+1;nQ&D z(4wgm8UeQU5Bv&Gwkc79mzjbmD^O{|Eb>5cP-mTKUB_4 z3m!Pj#f@pef_4OvoMYuKAn-fde>lx}0B0jqh0vY|OnBy1+9~ z4&!MXR09wCkoMp}4KgNSNOxS{czG57Cnx|!a`hx$RcrE;fB%mmT#WDcNaN*Vj$y_pOr+L*s#K?(R%*IkP+!+oX*!KRnaLRc9 z+88F5thi2D?z;8M#~s}q`;zlSLHXZKE&ck{U%$-sJ_}8u$1LE>WT-{U1XSSf;&BY~ zzEp0S50`8RtHP|U6tu2HJ=K2640`^zygdG)ag12n!gsfs5YH&&{$4n8DfN!&^}oRp zq`3Fux$?hHUb2Gz-;JzjW~!p!7Mjl0_{RNl+v$2VaVBs&B=%{&X7ZnRHJp*oPg_t4 z2~Ch*mvx^{PxyA5zYEwk*ood+rf|uv4^goe%G1WF$DJls^+-PPj$TwfM3EV;_ahzi zrDC%mCRF`~P+MjLW7jRp?&~oWUMcHA>i?UTz0RoQvx>pESHu=vdRgi7E>^vWNnUpaFEm_|3%r1B@bj>iWaVn`fJO9rR=%L&Y^7%w$Ecuc+}X$g6+u3@>94F{ zI1|^lTVG^a;F=(2>jF|ELHny^GkYRzwSzF#d--4cjU{z-#cmrQ>H?(*Rvp%MqkZ(u zo#g!t<;h>GgWqB#b#QH9uz^~oaU-$iNFh;Tz@4|J6t>s040j;hLjip+0(w!?YYT@9 zmes<@Ti-9gx?uk=@)A2pxwLl0vn}*mh1dpymRYRQszPOV8)-H^G(lMIdnB41_o%ZC z6Pry6a6%i=tC5cpXQRB}eTjSJ!5xeChqH>A5E_ zW?06fcgSTVV(Up5r3W=j;nsi10KZC#Q{lU~m7#3s{#K4IZm=~fZ-4a*b)Ok#b*YDT zRR=`h#qnEfYxEO|y&Zt^}VG=!x8B|iST`xbyjPvkB(9N4GQ1>Srh?+_piTsgrQ zyx2U=$IZli9RSxrvEE_lH-9{)L7uZx-8S-p^aVRrZ4?(&MSyXmhzQrj2ZRNHXP{<@ z3@9Db3yLj<4A|LANz=ETz}?b$Gs@ce)kR5dZ)-dw0WJtzR|SJ?=-0XFc8`<{kz6Ru z0{#PGNgY18#Eru6{POq{AXat<mDEB48*Hv90ArD$`wRzuftWnrh0`PS z(}J<}<>h%bWYU;j>n3=QOm1RJc7A{6#=3;t`GJSF6V^X{xgi@s__zg96l{wX!mL?>EVhB=FB~&eM%s&0?F6(BK%TpD-%m8!$*zQG_L3Am3=h2 z|Kwpbk5NT*%#Y)p2(LHZaSl%_yvnkjQ6swAq*XCwIwJQo+4g=@K+?i8#4gj+;+Xbv z5Yo2lj6PzCwGh}Bk0Ye>v;C|#=f)<{)>tc-Lz{kB)FQP73uR3Kmf+PiQ=;>a^K zcfH^=dEo97TsnHHyv&xEI1(KCmFZcjUT7NRY^+K9CqbMz-#e!5c$J;-YNX>s?23M7 zk3+P5@>~r;>}sy6Msn52aw$$pU*=ElDAv$TPVQEf@jcsmH7$eQ&3#67phznY;LWgm zOCPG0E(TXCS=T}~dNJ&uTALn6ap~>)L&4h>P-yqh255Mb_pe`jxIGxa0aYuB6bXdu zww_AQr6$qmDyxTLx;f#5be@0j2Rm>-=uQQ9F^JACC1-^Tk5!twyyzXO>(i6@dN{qP zl~2&Q7ON+dx5rm_#Xc-Hpe&_?!By3hOneEot^IL$8RnttSc z;`t`p8j9h8Kd%Z`_-CympT=nSeR?N%$f@mTIpSos_~QmzRAlx^l4CEm=1xlFMPHh~ z?9^KumIlAC71NtFyqVX$`4b*tq64J&_k*CskXY<^sLj2_%FoRq3g6& zF=P>B@1FC>RhcTWXl*0UG32%Pg6GfdQodQE;~y)Q{tRMVa0ReDX{R4<^Q@u@T&4#h7Bl_9 z-f;RNQ}OP)2f2V1T47+2cGrfr`rIvmX$z?3CZ5jEq#04YXP3r*t`s7 zV9hk19DJDBasFx10#F0?p5`^yK+_hdxkI_+V4%W#3J)Qb7k6qh@`G&{(MBaaTDZP} zi1`4Y-F0K|zzX|Kt8zww=E-NLW?2fs=6S(}1zdYB&Xjq{jt8SQk4~`X*vA@wz?q2C zv7XD|L6+`|!wCx-GF7Y*e~YE=l+uh)Rm46O)?e;lRLfDI( zZvJGAqyP0yWqzWw+52mt4M76WM!|t;mWcPdYcCK$E8UOGd#NYpA4A7)V>R1`A3HOp zZ1}?pE%CHSZhZ6h%4f}F2F0!qUMCK~vJ2_+v347jSNRbp(DqwuHQ~w{$ySTea7bt1 z{^z;B#W9=9vqChq;{4s)t%mbf*^~yY2KOcOs_~k7P)=|;TbCi6mjZ3~o8m%J|G1jA zZ=fuo_9sA=GWpchdKvS)SGGKk;U~iCQkmpSJ!ty9BuTb~QwE3xtV?OS`OQOn3OPM6 zLr#sYGXKA?{r*kw`uI_FpJDV?V1~zaYp&0+Y>^P5XLJ6HMg!mV1=@CptiUgBF#Nfe zp{9$nT&v)%!iF!7pD(85loEm#K05N+62PrSwLnFb*(s3V`?H)%04ez&rD>_)oBn^n zcO1|ENibTf$aQ?=R;0Tw+FX`ryFQYyzn-ZEXCQKeLC>l?kh-YjSY+#F|9Z8CFgWm+ zwzc|tMbxGh;34mMl?`U32?QCLYinySA5(lc#>n3-gZC(IC0FVPc_bgxg9#d7CDV+% zeNikt4#awq@9PT&naH4HAmwRQoJ+4<_ zGp7Cz5TDKc%v9|T9zr_zY#;8@L+ZYsP>kZdn}^wz=m3E9%8> zB`g}l00yygst$jMqG6C)->S9FgxNl=Lv(jfY`fWxm+nqTE&b^4A86$hBp&VCk5;fj z3di$wc6$YIy;SRLVjG+wkG_kjYz+&94bUT00lHH!;@P7@=g~rX<^e%tQl>YiqwScO zTq0jsj3$e&E99>pH$~G~O8Ch&ZK0FHK&ZyTAMnBtvBAU3>4XV#{J48n3g5E_P@N{B zM^FXS}ELuHcE_gw%#jeY642Gv`j6`<=5iM>JvdM}pIpjv!7_f2jZTIUC&syxJetE*onJ(&520vkh z`S^KvJL0Y-MRexHm1+RQ`*>lRiXJ+2_|>OEFz`3TW9h?4+8Zy99-wKk$dqPn+Kw)S z+^JC?slikG<@Jp$WpN&6P#UjzxHhtrdg>3Luq zxkK<2{gw#y)5YUZi(Jb%-g>!(DHHQ*QcH1{`r1KE+WeL;-?xM?n%fv&{`S&DhwE5| zqY$)XsmkvD@QMlawe;CFaZIEYwwxN9h|$Tp(Nl>?`a z6KT0bUHFh4gpY|keW{q|fb{WJL8<7|PLV^EwJZ4kgG~Uq5xswwbDkD+lD9Tq<2P5n zap66WlI1n|SCrUk@WiskBq-l*)MB?9E=IOO!Nq*U^4`8BK=9?Z(Bue6MB5Jj1E#1n z=0=`qmsNAnpij~(HeI6)ye&{nPg4o;Fza2_8!JRu1_$0c+Q;ra+C{%wv>F6Dq;>K< z!6Kn_KadSXZRbZ+Tz@rX>Kea&MeokDp)|k4eNyw(8J599KE{?wW2ItO z)lwv9-=!`6DN|hWW(QT%sf&jxTcbzC*Mt|8q0g{A4(Fd#PhQsKpr$`VF}MWYJQ~bI zW_AIrAK|mM(ZL?%%DM;VCeXVaqNKf8ww4zk^2+I*xLj+&c8N3X_LMJ`n-fwRJZ-Pf zp4T+y=4T@{d515dV#;U>psDoZwLTA>I$8JyOvXaPOZS&!qSf}D{Sw87d{b*1-~H3n zYi8B@1x!lyZw3jqGl7DG5xT5%_N2Bj2GFa)%&8^vl8=kk$BKcQNf~rwUQF0K^mcD_ zwignzV(MrT&Q`=}U7I~Ha_*_TGkhU7HaJ13kG3~I(`{pch z)}+CF@HC$t+Dz0d!Kokx7$i}K=g9gK0ITA7Q>w<16^fQiL)%$(-fiibZu zwANDC=lRB%)F#Sp_dvHN4KSdtXg_vJuFC#z%2!tNK5JwOZDV9=0cOus$~mB^~{)X!W?zE)BN>tx>hkp)6l%WOx4wscN|CRc8OSRoF|vk z#23L%N~`2rW5PV*n_(faZB92 zYd-mTY9bxW9^L5xw+OD-?sQriO-&<9t#Q$vp+GyVdQA*Pu;b=xf1>~-f2nnWt9&>W z)RUSn7BPI-<|n$})>{NI4)ASzt%or2X>yl)Fou0BzV3I-A1Nw-zH6!Y&NuMpyFiXU zVtcFf+?$WgL5LCKp|)L_fr&5ARSb6YXEK;pp0r7HoI;;>=Pr*EO11H}?Jjl*y=%9S z%a?mqVPI5)-EO8bdm)oYMWb7&{G6@$sq*RaVZE}?@nwC=?~Bb&nk(uSBW)7z=d1_V zeVCP5MdzqB;knS2rsBSr%h_|V`6mW5981I)%jMyh_}_RrwUKNAy+ScNC##3;CFkoxlwP?>-4+?z<l*X+D+&r3E# zZDx4dT=p`pALL2%ARlzrW@q&qiYLPM~rfrrKsbHtc?*g1{i+p&FWJ26k!#EY_X>fnw~yb zbh1ll9ewY5c&RuF$^RSN^~nE7Np(%_5{2qyCVWcIk1fr7=NkO>8OF*dl4kvz0&2t~ zBwI8uxVR(B{1t)g;^gF@aJoSwbGw1Qz8+)Kv7)l~sqEg`v1r0wBw;f;1+avDpW+|~ z+EsdQiec@%c^`64%hq2LvD>Gh^RvHyKhLKyjE#5Y>BmAsBg50LTzV1=r}8kCsZa0S z(s;#dOOmU~1;=nn`#xfJYSihfhb%fv#qTIkpUf$(FJWV!18d!s2(IA+!w-h;!gs$$0CsRPy#qGBzZ}gb z*B5Z}lA2p74)5doHq*mfl#7i*kEWqx4rTK*$Db2=I#)7p3^4E3@QjuKKang5n%|R^kIQF-ajWw+ntb zdt1tC*f@~W1D}sF>HE9Lbz8u$>X97`JSUZ-PNbgbzA%F)`iTvVsF>t^yuvR$88rh%gK^oB*p-_$tz z*$OUR5ulm~P0xS1jv`k~Zvh5A)bzWg(L$1QugtX1(dtrwtw}HK5PP5t7JriuW{2@Q z*hnfW8E83~>2~JXL-vy7zd!p7|-a3prR1!BvI|>rEGL#mRw@IC41UW72 zr)+%kB5_!oaoY)UOk^8_=kUUs8-Ri#P&@M)F35GjJWXReu{9sz6Wh`id!qF=BWyUy zdyBl-6+={w8-KmPJ=vx*L^EQK|7xDFhV}Qs78;MEP>!8p#1_2x8yst6?ihAMz1QkE zs;mYr#+QdY>n#AZvp!ymLxt|A@&H@OVC_}VHvdSQqtm#R#o^{+<+pG@h7iH}LqAwj zgn(hq(YErA;fdB6pK?-75*z)&q^TPCj5&mDd98M@elDMgAj6-SH@XY&pA1D~$E{(% z3g!orx9=oGKa*%d^t$8%txF65aH(#%6vEUFi3crdR7a*?UB|0FEh;V3jFKC-x%{%) ze5@4K+hK(HZCdjy&t`Z3u@<$&-L<5)yR%x1E7%7`n z0Bu*~YZu6nxZbBU6@#W703LllpmgRwo$4%C(*ETXZ=co66)B|5COgWiOS(s`>ot>{ zL}2B9`6^+a^riQmIC&ulp)0Ytpg}BmbUtI}XY2hn$}fF3EUJS+l#@8UW>3&D*2#qX z9DK!F`*;S(N}s%=w5UcRl^@w(dmk{F{^EcV^TmU1eKvrXb!dLiC12$WQXCA&h#=ol7?A#zLxr}7;WcA^I2ztdU))BJiQ6?B_R+}SJ1OJB z_1M?28`z9_^b3U>n|sa8MYK!hd`9IP?}-N!NOyi1asT#Kvhn09R--7woh#gR6#C{P z46CENS%Q>-vVC&blb4oQ)(+0o{HKFSN0uYAork#Btn+=>IjzFmN@eAq$DOsgZ21Pg z!P_f`$N^99Jdb=tK$0PA5!dRQ82G*Vsdm1HEW}}MMyTG18{3iVMUd8~pkUpvgn2gd zP8%4{OCSX+d)G^D6JXc|>9xjfC_p;7Xj`r8XKsUf4Q<+(yJE#Qrd5_{IDJ605^o9% z=%^za9G+G){L}Bwjip%>Y{BIVLc)bMJ??UY0(WIMGK%{bH<{<_$NGFeJrtyvd;}L$ zM%5Q8bL8cI+^3vaO4nS3#~#F$nw6ffJSa z>&g8&ES7gxX5RON_hy-P13pq9xRmm!s|My6L4-LU+gYv<6&@WkLZyiG+iACN@H4G` zQ`R=`wNTky8(&T2`Um$U>m74gX0q1$$t=Ck&&;s%sog$bbMyC;1Bw6RlZz4kFNSN_ z0%`dl4SeqZCcpmYUzC1NVOMib{#TS9UIZM@ny#e3T6?-gx|f%*Yz{yuDZn;=Z2_N# zhOvGnIUb*2sbtP!`CzFt#|Mfyb~@AK1bv3(GuyT!sO{c;;ComS2BCO+Y6fC3t({@3$Y z%HnyNHcr5BPTyGQ*so)^HK=y9*c6bwvaIfTVY`2@f}=Zt;T`4av)yB)q&r*>T;#45;NX7t$Ayrd!PEIA0E-57A@d}2 zG#T_(kM(z2W;gXx&TEDNvabZrU%(tufeFb8!sbq;e_r+YF(8n&iW>a2if2gfyt}{| zCe((XGhN^}_!X5PvTQ=GC=%MxAp@31pDy_+xvmOSoIuCuS_n4jkCx5Ga*BT*;O3!e zyGM;ev{o%6Lr1m=ta-@gAPt2hl*pUOwI|_HgZo?PHh1eJx2~8c6y^5D*c)VUq0vbP zh!#ZOWd59=aO%rxKoxdY7>c_((NIjqT8ToijkSuFx<+c_a~)tWNPre^<6%7TB|uBY z1_hWOk)DJ`g9Cekd3ugPCjZ&`5PR?TRx_!?8G#y?jBo@<->3J($d__*gTz=bjbLrF z`@DczsQfYJ0*=V1FJfW?7>%Vmk^Gfce{0O$7oT(dY<%pnIO*Jrl}+HJgdCCqg2%_} zq~&`m+FgpW2Qmq-F3Tp`PL$(*QPv$MEPid(<)r@7b<|&@&Bmt5i8hb(>G2_Sw8`9S z6-)Z9NM9fz%cBVwD_`qJC3|#xc&48+e`M4_<@==E*BoLb!1wR~W$EL%o$E1?6-+ho zh>{LxP#&^N<9sbm7)4|bS5v%qH71q6B>Op_z|ZV8xwWEF)a`+f%+!s&|kcrf`I+o%MlJVluPjJ!JluCKB*hCCrDb) zw_NQdmN_kYZ@D89*0HE$?~PT`;dl<|{^HJBP6+zgQ|bPoA`^=D+FzT0|1LLrB~!ftF$IZkPI)$vp*lAC~+C%!S*- z%MKr5y@1Mp^iHgyT?sTb180!2pRzZM%Qr-u1n%!xHI97#yGX-#ft*7blRG?Kj~~Is zI+j*`1k+ZiO$#342&a*vZ{?qaJl3nfG^Fh1Cm?(6q;P9BGD^lQj}TQ&7VhQn%}pPP z$OWswt%y~Y!#`gBx_fP+?)PMXY^jY_zE=S|g0d~QySVK2t>LQw}#IT_!Um9VW)hq0f{hTB*)wd7QX=rCh5!)3l99B+RQO5TpdoZ+vhv zgvpFTt2qKEBphZ^RuE(T9QT?Jy<;372;92xVCEtD+A$&6l{jOdJ|i0Lc;@V082=eX44D>UzLclu%~kMr`e?e`V8;r9|-XB~JGPp@Am!{}c#wpIQ| zVZerYMQ^`Bug?Dv?E5u6_?@P6!>`~dLe%g>T6c3r%?%Axybr5g} z?4IoVfJ09K>c_?QxI`6-wx{C=soAf=$V?S#x63~{E1&NCYxIiOib-M5eF-mXZRAb> z?>g(9#JG&7^TfT<=K8Izhl*&Q^$0pkt+&f*2ACCZhf(QJcXsPFjXm(8v`$zH?~>v8 zsQ}Wij$ZzV?LRG@-$(2k%vbicT`0-R;8F`Z)6n#~^xfo*ygPqyeP_0%tem%cei@|c zw{nYicJ{n%uZNV9L?W$R<5rcrYfhQcUq7j$8g@&E+RrppTCp&e%2jl+$K3v~RB4_Q z^NK$6L3u;#;XF?}*EG>uO-SZjy@AsW_ri-N$uvcPj|$p57}W#;4Wsq{7LxJ5u5ne4 zd%wqf(gBb6vWKtKdH?*J6#YBCd~$Jy*1if4`}K1B2W*G&ImezS!t~9_oHw|aOIY`4pbsZlKt-a|4M-`jFNQ26?ZAqEXN z#U~Nv4--x=taK`Czwvu(QuQSr`N5Wvub}YPu1}**P&uOUm&;3^}At&9QHKsn&iRw z6WkkOAu4?yjsG1}$_1&CdZb z*yz(xUk1^a`8gQ#cOS$@10z`SoVuB@h5x3I@0S1LEll~>j~o;v`t5&Cg#Lew(g6;{ z-xTZBmE(zq;TLJ>gUtyv9rUmc81WEQkeHI!3x6szrLXyqGqNXnKc&WTK(#+=%?Yr} z{*WLazt1SdvHfsbC)W`F0ze$`yf?N7CNE6{sg0$p8mr#Ld8h#%(Uf7pu@B6sd129r zN`D$-7quRuYH7OgB~cbY#FRk*zCmKR|I6l1Fp3a}xBgcLJmafy*Bs*ccS!E<5S{rS z4Ke)Kw>a4v#!M`J#4<*{Q{fJ@H2^vr*&icyE)Be3d|WWlr3sf?%;$~iQR0S;-2nWK z)`OX0#^pd%Y*j5UgT~cT2cINv1<*?NACFv+RgbvgkVzt7_aoUyE`8k2F==|{1ONl8 z@8sR>(#p~{<%|r*4(;*z+qPc$Je4z>P7bIiC^{O(x`m}~&rx#H+2wk{Vfdb;+sX>6 zUlveFv35J=Nr$bK2Ztk1p#FMPI;d9AhmU8T&(X zdHOY4aNQ$L{YT6?vQX&CGR&+7p_Wjur+KuStgYMxSOpISWw?w=ngoDRJXq14&sNWg z@-TsVp{)ecjq5UPVW2wMOz}nE$uri{}^Sz|3~%bCVY7SA>=Xin4zjkg& z?FV|?IkL9uom0@~5Ws|c?q<-H6qaS2A51i619+d}T*gtt zfC9VIlx>!JzaCW8rNC>_A}kYIEFD z=tw6-`^9vY%Gb#Sca8D+jDdlWD;%4{7kdk!!F#{b)PR zwN{yD<)}pX<QJ5_s?sI15<~= zFKoP@pIyZv>MWKv-D|A#uQ6tfU){zZxK8h`ZipO8W=m#um=ntd2BHFj-v_ytBx0Rk z`ES6=jjGX{w!DY%j0}~BGB%PrvFozd>rapPT5m0A6AVx-Ej}7~m*uK9j3+8owBERg z6q}1({RoMM7uwjq)=h0B+OL~ko9LeQ?-XNT_MLu?5|H!@;?=HOUJghQIEesM!VSZp z@;_dVXX33Q;+`rCss{mEd;FJTbzdIZyDcJ;S6eK9*-fL7wiB?Lbgb_2jVe4W;aTtx zHhK1l`vQ0jS#=L-!K^BS%JDaX>#TFOKIr9yO1FAltGFxB4JOm=sbNb+QSUg0Gq3j| zB&ISnJ716oo8>xhqvl&2CJS#c#F@<5$F`My*zT`hN`7_L6wPTEv^z!#UkOCmPKd#$juuO#G)~`eTx(ApiI}Q8ssviL z-Bp2_4ePCWHJO7v>?l{wiTl4>69<#-a?Y1btzEZn+@Z%jm3i=L>`d&gXI0_DN#nHr zmVR)uXsp0l3SODG&DTJ?bz#c@YyUuo9duUly7l+xF0LG48w&{0KU}R{qAk2`1jS$O z>pC(tR0+(R*;IbzIbE~*G43CcFhQvP!~=$nuKC|Oq! z;NI=`If1zur%+szKS%w=87q_+%iJP+?>`l2kXgUXgb*m(0(VV&4I*hiFL{-HTBk3E zuk%gCt+urs?lW28a&1h%N5V*KOK{>7Bl-9ov@2=RxleQ5_QtmQ)5Y&(t2y??PX`{U zDg(`NdW|?~z(dGrxZ%R3rz13S-L$DM_x|J4oX%H@4Sx#tqy0nLeNRzsI+;+P^OZRe zOJ+3`yTnEx=t4>Usq^4h8+Tn8v#c-I>3$D3vi)0P!1sbM+X}0}C*=4M??NHB^W>7v zQo?9>*{J~?JvoP{Vv}ozt`8Sy>c(`;Qxip!f|9+~&VnPT#OIHT4Xv--1v`P6O-{zR zH{>WmJc9T!Qgq}w`-2tgsogO#0rg6|i9kmap9@(JI=`L@Cw6Fr>2Sj@kuzFH1u4cd z(~-f)ejxDj(p~zKaV#_t@j|u7oF)GxMf*dPEEC??gW0JLj+kV2!8h}W*FZ@itWjC!y~&52H!Y-q9-%aih+ zddUrmD4+lh9YU2Jk*c5<_T*SQtTUM}MJ}bsEKeJ3$IZLcDp$q)AY}yy#^{aD13F=` z!JIPxA|V+V@j0oh;$nWA`f*6k;h+Ql7ts%nG~Nk~aJVkOdiLGLcS=ClBYA7X)c%F` zKp@|V)}y)iPlWB7d!i9=rpKm4lOvUNq`&;Sh)E6q&(Yt*RA(Ewy95#G`d^EjMN+@% z9pB%g@1?}fPDAlVQ$v#urvS;+*cH_PJg8Q67p#K!9Mv1XIP~ z(|hNxV?=9@hZDHZbaKi4Zo{fF4X+Hm=AUZ3%lhuzZkMw_yjPS_W=Nv}3QkuJH;!qv z&1f+cIFy%p{P>G-IOyf#+*f4E)tlze%$0tOIzBEG_r3ix_u}Fc`2~(->idi>lmhdH z8GC3%#v}0;7h+p)+1IRbrLqR+*iV$3?`6qQ|S6-MUbQEls{!G(9Z}?W2mfT1eI(z@ZK5TbRo>X@F zT*G~?bDq>6i96c4`5o>1Uc%Gs^rNo(T_KD|o|miH*?GRdt&@~^Y|iw})gsX_L~K8; zQqlQ&=bn8&wu>Ez>t`81$o|c8ANh~#Z~c&Z@3#E4!B2i1Yai3Oq6l!o-hcW)c_9i> zj#eASONN=Rsd%zuj@v+v?iuI!*J#HxwAbf=GECW4zvwJ{nuXVjJn+=_PYVc{r|fCa z=WiD=EFVQdA_MuabpueCm}sZZuu}H3$fv<34`D(d`Rh0O%jO!g>eY9%ZGQkWsA%R_ zs#MagJFatwR~%HKiD;T&IB@s zv3-wfYa0vjf#)hSUGNu(c676S1B&J7>DiJZk2|tV2{Hq#cp)R7+!7R+zB(6TvpUEs zh-;0D$K&e$)BjpNRESS|^ESXR$RasudD-C38?VcITd$~Yedqk${odtfTu6if=1F0_ z__2hpsU54P5cj5^=}PaTi)r12dNn?&*5grjluUP|Hsc=2G)gi0CD7jMRsXV`8PB@> z(J510#IWknJV0keFg3ytI=s;RXmuA=fdCs6cTAS+a&h38Ii{0W z5HCK>ZQ`j;g1{YYS=rXkY$WU)g<02`p1E*P&}6L}xn$;^42#~1OPx3D%rMvo!#$|s zVGb(uHcm?L0}mc8NOo1yGV6djc{0b6l=b$ii%ng!_2PnQOXFq`v_ zSgw`>(|lpAF1HRJi98b^1q}qO&_o={v-``^>wH+J@~6*KtAXl2N&k}6FnwUe8{%N- z5;iNs&t`M0LA>)rY08GjBOx0F4C}=^-&O@=%hHRsqGagH4GU`<2imY_P1(mu=LQF> zd+w$!wv_R(b%9>Last_G+UY!tgo`1~SVwhnovBMp@I}I$ ziSY39^GdKvEpYT%P;PN;ga1lvaFu9~oihwv|q5$`6dn2StqvHRI<|t^u}1 zTe6{LI-#)vRt4OHM(}r-G zSCA*!Lo5z==gCqZA^$&>oq06WZ{NpT$Xd1{l%=w7l`UB&)bB@V6qQ6slAY|^Oe#xJ zijZ|$EGdm_V>d}zLk44uNtVHo#+Vq)%yWH}?tag6KleGe|K=QrGvB#lR*)C<71k{`Z38t2$kjO7SlDehzHZ(xp-M@UWDOK zwv9N7TFY|ExzJ6=?*vzxX8uTwYVBMfA53H)`(u1Cv~8_p7n{bet#M1;JGY6!4HS;I zK5V@b?9fp)P;Q)b6h&`a0SQw7lqK&?J;2D3BB{9lqPV66CQk0X#1n^+x$rQt)%r%h zJF$I4Z!qLo#V>f!Ho+~FF{Z(;1a$bL%WN}(tBo^9=l3Hc5u>q|Ro_=5T5bxAlHqCQ zKXgIvL}(mz6iWQlW{K;y+0CMAZ|?m0<{@rs_u)awKG0 zkkKBO3gsuBgS3Pv=gmmtc{;>2J@Big*YDZ+08<$in<_a#GY{O8w%u@t@mvWDu2zHF zN_;1a5PU6}_X8g$KevuwdUns{CytGr{!EiV)-$Vv;eVSP&#uIgm2uZCNo4fT@rP05 zleS$-ENZ3^!0Iq&n?3OYKW3}{M+5WtpA(e*uD^aNG`aYX{)j&`699LO{!=F552-!Q zW+Hz=20p(09r-|m@yQj)K0s-3UEA}e&vEIiZFkw3eogV{_+IMjlrQD zFpqeF)LojE8HVcPh1l@nK%4oI@HG-ESC)U^hkd%Dg^AK?)(?d_|TnMf0F5%;z?M$*dJ$ zUj-T)k(u`O;4g5@I5Zs2z06K>4olMuPZRicDIU&(0qs-&P>()zCd$M~GUl%*4{nTt zs=S)w#<%bpC-gmzG9LRvhA5PA)9MP9MBuf|cAEk1#!4+;u^&iLQObR4A>qwPxy`t) zpF?=~bVA(g_dx`XCLYS`Y4-aLkjw}Qk3qnYDLVQ%sx-vSm5wos#}j?u=kKSJKtjtO zD#SFgWS5PUUd&ylrh3;L!<(2K)l;Z@&EB*p+f*8Og3y&$Gqj)874+{&{;9WU*2sPO zI<{ued7wBo@bhGOy5Q63rKxF*7vUS!ul2FZZ9!IGp&X3pp|6Wk3(x@L+qdd@Z&6Lp zxHFo9-(r_Bw`XQ%K11c$y zVf&^^po3tRy%@4Yr~61O%VysTu#hFdIPPXwZ`3B)7W;DrqEUNt1|ygQ0SV$;Y~4+8 z0`bCj@qSNCn-yph=1m%J;yT+RS$h~FuT}0#$Zs~py|$rVf-w1lSHE4Hi*T|`eFd0q z#GDzA_cup2vpIPNJIeco8Q`@7X3Of(yi->))z#JYVvGhhYW}5`p>ySS!`V~*iTCwF zZjeB-rw=oyx1P)a&Av)#<_5AdbC>923ZD3a>hLEm-?0{_w0hazg6d>A;ienVZ-m*C zn)k;CKy?wu_h_QXNH@@UXnu*^YHMq&9mu4Y0HGCf^0yYEHgul|7Y|D~q>}*7omogH zp-2B*i6uuUh>osUDx8Sbuls(@m{b6>=SSn#+cb17OJ@ddFsCSKub z%R_c5@+X~JTI1phJE{mQ9fjQsMORwf(8ST&HD|9^@KqwLFy_oRQ#aJs*6)xA1BxPK z1`GM3>Bnqw9BJ?x3cY6XcG^eJuSY| z(N^Jn9TB2c2rb+=OcCBnXiZ$=K6*7q1ztnNrz6CQmm15Zj=LSlMBEsG+K}_AZK49f z+ogItf3ql=Uo48D`wteCU~ToQF%qK|7+j{79l3Y2b}p#%Qk2H7J?#ZhTlT|_@D)UT zCs8G+vHa`dQlsoudHveu&||#Oo9-7WH)iu(P{3vbe^iOllf(Jc{Un}lXKSRgb(!m~ z+LMg|g^=mO?17r7^(JcsNA87GCpYR}_U%=tEILvZLml%`0#>H-iKf?EU?lFg#HCN_ zdrEPNQT4a(Q*D!c`S9QkJfD!7+9DS49CPUC#u(iCB}Afxo25835qAWVk2#yBS2-3K+{`qN=;mcQ+v?06O%GeZ zx^$x_+=p)@z2=jZV;0Hm_dh;~SPh67(Evk&_?PwZ%R> z&|sDZaWAQ?jy;aJMJKt#T|4^n(l!4sZq~m9C7*=RkAWHx3I=_y;OYP9}*L9 z_M0jd{-R0)jmse$RLSbbI#tTnR&p}1HV;_(Oz~w7Zt_zt!<(WF@871REJ z`UTE5c*V#5s(17xX=W*dt1Zz-FkfJtfQc?m^sK3Sx=Vhu(a_b4fng{qkCY^?*>HO; zrF{S-33Ik3uR%=}o{Fd;?$x-U@QuC8g@Y3ja##Q<@D|u+8t!e0k~n7gsnyyapd?uf zSuw`LQiSxv`x=|vQ>(@ehU&|o)6($OET`pO)w;RSuh7&UaUdz?scP)({1pwU&KVO# zno%ON!j8GZhss*wyWyzo@RoN}V~9~s7WUxuf1$#*<;FSXA9|Riuz@3KK4h>M9R?Db zp!l(W)57Mg+>K5fE+Gdz+3>gGua^uuxemzx`Z#d>J3UPQcoq`-k2Z>puna&;e>%5f zZvG+Q`sa&Zrmp-gkYTazsB7s^U3m3sJr7n$Y1hL^@K9*fcDki0G}hH6=(CSZ1<*74 zfv%jK^%+}qMVRSXq8+q67Xl$qm1rzTU*AoRG4jnBvrW^!EJ~J3FP(m6EG0e?)?DG@Uyd81tqtLhW9{WCCYDbrs4?TT4KV z9-hL}UlTfdUAmuFX2SFLYcjzNUl%A3J;xgFG0I}H&%d0H{*8(#j{Un^JIDiHH@kG7 zk39(+S=z7~?EPgc@N9_M{tZ<3zl%}^oIB2A08Cp|^QxuhqRv0th}cqekqp%?+>8VC zj2hiX2$kV_UhL#*G72gJRxDs^z(MM8CExU~7r_tTsY^scHMzGNtO|#wBZYAZ+;RwRXsD%oKA|R zuhf$dfes~uqIGFjC_~`B_#`oE@kiS@eW`OqN>|fqA5JHmj(9L*5UcOWtJQ}H|7?Xt zLK;l$P<>_p%%&gc*HqZEA|^mtvnpTH-&JOu3&S8lm3*7eaX&|q;$zY%lRB~2*yhRF zafRud+R)a z4@B=fL&qUtM*c1YbS(-COfrPl_uq#-VS^V^Bor@Vdf4Lgg#t#iwhJZMObIA*^)Y|J zD$<(H@$)Wvi8sa}K^}>nAbPTz5w>7)vYi~(dT&qPfV+jVz7wA@rn*iX_lr=`ul_fL z$}vL^H{kqTvrYBi) zoE#O2OZ|B$u_Mz!bWVN>qyr~Q5sTk?n`*_%@V}2G@%at^2+w)zx2+SZFOvU@P;ogo zN*WnFc~JkuScsXxp3{PLK-&6s<=kscOc$uq-*xx*iR9TDXZ=q+waYVmJu?TKKOg^6 zI(E0+^VxEZ`Fe>hU17(y8BDnF!4YA|`0C5&l65#7TxCfK)AP0+su{4#5r?$J;q*0H zl&33=g|lR|CKPI~Q&k@aH(LvST6ieBt(tf8^5MSNW_J=i!7T*cE4x2kl{{j4-PjII zaY-Zf8laskIKHGME;+3fNg`^^to33^C8mAva%vC)`IgnB5bYuQb!cRAMr#JCN4|aL zWN3}Kw2kAqh@C43aj8b^HtyG1iTPvC^nTf9omoq=+IUfs3E_dr2(dD}r$;L@?J8v^#r>fBj&tvrG zp|qDY>+B)ho_>RU*650`01=NeYp+7cYl1Sm!cy~o9vW8o(~rMlj0h5*%4;Xc?e595 zd-GPGl2dI>2`d7IoeiP1&XIGdADzfcd^w*}@p^2JMsHzjI+d&!pJ~sPs;=GmT5u~p z))YYDV)Hw4M7y;<+b&$@ttiz8RYMJx0KL&B;&p$#;JI6*TzBvt+fz_AvdVgdO_G@x z_WQ_dmt`a}+czRgNakhZ8+yCFY2yTB5%!6a4IYQcoljp0vh8FW$rkncZdOVJLP8R* z>=mS~(cA8i=go1pb4ow5Th$}JaxsDV-3c=_5qYobPU7D~cC!jwhT^>5k`r8zcZ?_r z)2sR~d5E%TmAatCW61lH+8J&!)8)fJAR%k~j-roY`|7>-J&&z(mQV6(Ia0d`_1t;n z(6CZ`W*~NLf{*c3d%hQC*l~nTSmU{ZLR1aFUfiC5>^p_p@7#`zS0NImYd!W0l@wy@ z-g~SBCBl%2GHAXAl3}*7-3-Mgh@RL+bsZ$79uZ4>?@UKCM5LzE?z-`y^^XY!qW4#3 zjUIhW5{}Ylr&u&o(~Zg$s7r=}s}n~c2ijMb)(Pb!E&#$+=AZ+KD%*Ygu`f`r-lYYjQ2gqYX8Naq(w=$iKdmWNs&JL z*)65%X$>n4i>Y`NS1jK7-TyuA`D}7FI5A<*Hj&X%tQp{UYu}sx9u=FXHVd6c8y3cO z@iock(moulU_?o$B=dqv(UA{b3;aAf-d@iI#mR>nxrcgt9<>#6jOXMh3%Q<_#Vw4l z&?R~!@K@LNwHMat@ZL_2wox@(##4on!lzy#=^qaCZDNrsVlvofaa*@|JeN7_JCY9Z zxhF)OO_5yYGonPZo8dl{XhODer~lS5iNnLeeWs|CJAL<-`gYpHf1o64)XGiJ)cQ!h z=4mA1es$9|YlSOgXS-h=sA(JviK3ezmJxRpn!pv7QUDwK27H>RB4nc{M0n&d0JheV zrPPR&&`bJ;$_SOc{t>9%73tiEJmEC}(`EDTEo1a)@Ts>S7%EheMA$YqrEAcFZFaMB zPE;|%-q6)*x0m-?FRMqsK*Vr4wjLR=OggtYY}@c%SzmdRGaq)4k@yey3^Zut$nIR* zwgF5|{u5UXcTL*W)oYhR+e(EI1^Q`I(tGzv7obLWHibN#ej8tsp5$(UkvcQ3Zh4;lX@eqY6vqB>ecx^J(*J`C)!1a?|C7f?0^{*L@IQHXpFLN>ibor3d2)j8hQmWfqVa;Cjl7%;-$gaK;6Jt`%P@AT?D_=J333YRD8&gg#oi>x} z%&WWvpA6OAT8%~kVG;~(P{;uiU=LBz?r|@76p__Wza(isbUocV9}PgUApl(&C(kmu z?nLjr_%G~j%j#rV_-EQ|q zlGoeg*}*Ln;Ey{t+_{OZY{xB|b*gpQzP3lST5!L8OQp{JZ*o4b&NJIP=b}drK&!`0 zym)OqV;nhnegGpwLk=hH z_`LWSu7UhYJnl+M(sg-ePjTWq|LRM%sL+QexKG7ztx>x|ZRA@&A}Wgow`7Fj)S}H2 zycjOm#hZlqW@GbtGp^(-j7NH8ffE8ki%rDh>D{9H?$>IEoD5^477m z`Vu9y>t{#Zg;%P{i5MUH>F3?VvhWovoMQ_9U+wD0!u zmyObq);dwEDRdv;ePZ}mpfA(>D3eoX9i}w4HR^L>-S2ieaX;GIo;aQMK}9Jn_$n8B z|J&s_RwsDT7Ht0;p8N%mav^@v&? zMWPUQVm>13U9l7lFLm(q)qdyqBtQnlue1tG?B2%tZpj=yT9i~Oej@wm1O;6BTNDW% z9ga>F%pNl3d=P?#XgMO9#eBgPAldn0pDy=1=1}N^9@iv^vdp0)*tZJ}Asja8r6hQI z7S|*g88>Tz<@fv%vAeV{(WTJYzOUSPDEYQvTY#Z{-8*Vi8*C0NKVOU1dA5szYoD{` z5Ep)tq`@Eq*^eoiD)}XG)J!!$IC{E!kII`dKC%_-5T3tto)xB>dIu}Vdw4Hm^UY1$ zlRBXxjJqM%2}!Bfs5?4`R8sQ05jb-iZG8lju~YVs5sa#lr^uduOKynO11*ReEq?6F z0p0nrFPC-6oWhtya80uR|&8%YTUf5z)~+Y8`sEAt?Vv~wmmQ-vd>xAYXE)fZevF%`uz z6=h#~A5P$NOJB zxZmmf<07X&{r4}7sf*(b=huO@b;~dS;KEl3C|}WYnCl8zLwz0t73WJ!iyT!hk_N?# z+p&nH9P9Gg{G-gHXtQBvm6(kC^;Pk@_Oh3BJFMamIQg#kwIQ7K&^=?7xmmSZFEMT| Ta|-+`mQBVdP8~-Z*x&pgO_n`4 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 811bd65..1a3b2ca 100644 --- a/README.md +++ b/README.md @@ -75,10 +75,12 @@ if mySet.Contains(5) { mySet.Remove(4) -// Intersections myOtherSet := nset.NewNSet[uint32]() myOtherSet.AddMany(0, 1, 2, 4, 14) +println("Are the two sets equal:", myOtherSet.IsEq(mySet)) //False + +// Intersections println("There is intersection:", myOtherSet.HasIntersection(mySet)) //True intersection := mySet.GetIntersection(myOtherSet) @@ -95,7 +97,7 @@ println(myOtherSet.ContainsAll(0, 1, 2, 4, 14, 256, 300)) //True ## Benchmarks -NSet is faster than the built-in Go hash map in all operations (add, check, delete) by `~50% to ~3900%` depending on the operation and data size. +NSet is faster than the built-in Go hash map in all operations (add, check, delete) by `~50% to ~3900%` (and even `8130x` checking equality) depending on the operation and data size. In the benchmarks below, ones that have 'Rand' in the name mean that access patterns are randomized to test certain use cases. To make sure the test is fair the seed is the same for both Go Map and NSet. Here both suffer slowdowns but NSet remains faster. @@ -130,6 +132,12 @@ myMap := make(map[uint16], 100) Map benefits from sizing while NSet isn't affected, but in both cases NSet remains faster. +Another case where NSet really shines is checking if two sets are equal. +Below is a benchmark that checks whether two NSets/maps with 10 Million elements in each are equal (They are equal, which is the worst case). +![Benchmarking IsEq with 10,000,000 elements](./.res/bench-is-equal-10-million.png) + +Here NSet finishes in `0.1ms` but Map takes almost a second with `813ms`. + ## How NSet works NSet works by using a single bit to indicate whether a number exists or not. diff --git a/nset.go b/nset.go index f13b0be..c4194e0 100644 --- a/nset.go +++ b/nset.go @@ -199,6 +199,35 @@ func (n *NSet[T]) GetIntersection(otherSet *NSet[T]) *NSet[T] { return outSet } +func (n *NSet[T]) IsEq(otherSet *NSet[T]) bool { + + if n.StorageUnitCount != otherSet.StorageUnitCount { + return false + } + + //Equal storage unit count doesn't mean all buckets have same size, so we check per bucket + for i := 0; i < len(n.Buckets); i++ { + if n.Buckets[i].StorageUnitCount != otherSet.Buckets[i].StorageUnitCount { + return false + } + } + + for i := 0; i < len(n.Buckets); i++ { + + b1 := &n.Buckets[i] + b2 := &otherSet.Buckets[i] + + for j := 0; j < len(b1.Data); j++ { + + if b1.Data[j] != b2.Data[j] { + return false + } + } + } + + return true +} + func (n *NSet[T]) HasIntersection(otherSet *NSet[T]) bool { for i := 0; i < len(n.Buckets); i++ { diff --git a/nset_test.go b/nset_test.go index 8f10eda..f4fc0d8 100755 --- a/nset_test.go +++ b/nset_test.go @@ -75,6 +75,14 @@ func TestNSet(t *testing.T) { unionedSet := nset.UnionSets(n6, n7) AllTrue(t, !n6.Contains(math.MaxUint32), !n7.ContainsAny(4, 7, 100, 1000), unionedSet.ContainsAll(4, 7, 100, 1000, math.MaxUint32), unionedSet.StorageUnitCount == n6.StorageUnitCount+n7OldStorageUnitCount) + //Equality + AllTrue(t, !n6.IsEq(n7)) + + n7.Union(n6) + AllTrue(t, !n6.IsEq(n7)) + + n6.Union(n7) + AllTrue(t, n6.IsEq(n7)) } func TestNSetFullRange(t *testing.T) { @@ -380,3 +388,50 @@ func BenchmarkMapDeleteRand(b *testing.B) { delete(hMap, randVal) } } + +func BenchmarkNSetIsEq(b *testing.B) { + + b.StopTimer() + s1 := nset.NewNSet[uint32]() + s2 := nset.NewNSet[uint32]() + for i := uint32(0); i < maxBenchSize; i++ { + s1.Add(i) + s2.Add(i) + } + b.StartTimer() + + for i := 0; i < b.N; i++ { + s1.IsEq(s2) + } +} + +func BenchmarkMapIsEq(b *testing.B) { + + b.StopTimer() + m1 := map[uint32]struct{}{} + m2 := map[uint32]struct{}{} + for i := uint32(0); i < maxBenchSize; i++ { + m1[i] = struct{}{} + m2[i] = struct{}{} + } + b.StartTimer() + + mapsAreEq := func(m1, m2 map[uint32]struct{}) bool { + + if len(m1) != len(m2) { + return false + } + + for k := range m1 { + if _, ok := m2[k]; !ok { + return false + } + } + + return true + } + + for i := 0; i < b.N; i++ { + mapsAreEq(m1, m2) + } +}