From 15683485088342b3c46bf86589c175b81c1ba307 Mon Sep 17 00:00:00 2001 From: OusmBlueNinja <89956790+OusmBlueNinja@users.noreply.github.com> Date: Wed, 16 Apr 2025 22:33:02 -0500 Subject: [PATCH] ran some tests and made a little faster --- README.md | 4 +- image.png | Bin 0 -> 22934 bytes include/vector.h | 11 +++ src/test.cpp | 208 +++++++++++++++++++++++++++-------------------- 4 files changed, 136 insertions(+), 87 deletions(-) create mode 100644 image.png diff --git a/README.md b/README.md index d14b8d0..c268a5e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # Fast-Vector -A Bacwords Compatible Vector Class, that's fast. \ No newline at end of file +## 1.07 times faster + +A Backwards Compatible Vector Class, that's fast. diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..7906c5aa91bc3dc37dea78e0d040d0678fa7bed1 GIT binary patch literal 22934 zcmdSBWl&u0wyuo?x8N?prEv`!BoGJ^f`kTwySqEVEjR>%1_|!&?jGEo;O_J{N#3>2 zs=d!w`_HLUb*e(3VNy(H&wj==?r}YYe2|wyLncCof`USmekbt}3JRte_;>&j9{4|s z!&L`(2W|gRN(`!Ggk%qR@WNPBP815NJPPGO7Y=xgWb+Pe4+VwZ`TPdmYn^WZ1qEi3 zmJn5T(K>9F3n!LN*tuo({4vGcORx6M_SY|HnjRV)T$MrbYLtlSc3)|Br>_XwFIAd- z(GL*)r`r{xgPYMXLaYXAqY7F8=yv)0m@P2G zs214))uN`04U<&05#DmvH~LJ!a_+5);}|ANIf+^h zG5uzAchGkbbB-wNzN1s`OJURru9RUG#_T%x;CE^G(s_L@>c~PO7$AjiFLnMop$-=x zt7=823muD^*_HXPO#3hN24aO4n2pSsE&9E{+K~MYkRyGrVJ+ z8Ol9J{B%mvrkHEzEOL28nikSvl(V%ZY~FM4o=ZhZ(NU)6q?6j?9z;^=6_ z?}T10g+OUPv0D3`wBBw-*=|8@t#4)^k#LY2lG*9aT5d3;tl>1TbCxV-(16S`SUI>==DP3!n_np8op`aN5t&6B| zb5*eG&GR9jn%oCEd^S1mQ-BBFXDVE!(B6*-H)jgI5SK?tckBH*jMpvx`rx9!)F)}=)MjRXHdf&5l&{})XOba|mux%FKN^QciE<9^Dh7p0@_3($QB;f6 zB~zE=)Or0JYofl9w(ot_2pyw&@YZ)~)(u;wb9BWLY=cS2Cl@0<@cG%^)i`0?2j+_( zGW+@EkqzJDf-c<12SxHux(74*Ts})JFb{^6w+MMD1Ybu;56Zt*G(99pF`f*MmN}x9ph)x2wFD{>7C)9hqFHjHe`t8v74N3uDjZ zYaW8B>2)ZZD6e^2AK0HZwZG_M!cDZ2Lp?u>B2S%IPg6=_-7Zit0jhX-^sUR)t#`k@ zJ0QMGwmB;A@=8}Zo)Dgnj#<_fuqHZoMDgJJ20=VWr7OLO-gllJdrV_cPj?~^0&lm+ z^i$`ib;h2ser?sKU#*V>kV>_*)@9nQcs?$yxM?`Lo{7q@1~NN!em1+nJESeHozFee z^og-wgJL6fx;51}a+RubjnJqNDT#ZPOobFdJ`*x8Ux>;^$g;-=V7`cs;9Q6Eqd1L4pRRG=Dxxfk*aH9qG>z!2v;Ws(+8wTYHrg|Ic^1y!(IXQ2F`^v#hzp ztc9A4Fi|>GU^!ag&#dQ4$;(0yan;S5v+TfO#eO0B5~cgPM63Bu;B- z4_3dj`*RWk?YAXH<=UtoH_{pcL8T^R+fS*HzV*iAofb}tgxqCXiJKF^a?e^*%B)>X3i&dLIMo z;EtbP9F3Unry%h20OR@%jQ3Gy+)I$o!{k=V=Y2^f1P{V_}RhVR2ZD( zi~-^IK96(peJ{E>8F=wIuQcmN9f3vf&mPlJ{aXcj^O`a>*xy|S-f8Iwt*M2K879?9 zb*HBsx+S9GVd}=l z#RMNab=1cYlAS|iW z+h6VrQp^%)7h%!~oZuwiNNiUf7K72r;)uR;kNqO;5z?UAMWXg8i;qp9BtzUI9f4_? z7L8+FzG$)O4x^avMs0AGL6b1JyI}tLUorLPSDd)kkc_ zhIm}!_cu02_!ef#sxtxSFBX$g)dR+!^UG<{1;-&&|9)&y?Z}Asyc1L=vb4a^qz^bz zp+R$1{vwYB$AN(G1*WfEjK4u1rTCW0?-qbjeWYir9jf&FIBNAVx zb%Km5*p|d-uy{~n((yMXhS_PNnob=+_=d14cus*t({;oPN&|Gj{b+^1#5l&zZ}UMA zQ}^e3O5lQ2XDo`lJJctJ;MQQ8mI&9bfv$sn)^ElT`R>2_2`{mU=twu)!W88=Q9zZ}Kb3Z=k0G+O>XYD0q*Ew>qYavw$pdMr`#ODH46 z?tJIgQ1_f-%hk#AJ2<$RO_4!?(pqqp7Wtv0nLs`2j^56Q)05~{nQO`n?gG^x{B&W6 z!w#HYh?}=0<+N2}q@zCPoj;OvLde`qdeZeyb`k8tCU9Qwhhc$B%0MS-Dpvy!oMu7j z3%sU)3ugTUf_#;PQuRg34Afaii_6cW-@f?>oITl$g}Aoo1P%M&?A*>-Ti(qG5SUdD zA)Bcxt()xgNLlmPOBsWXf9ZH>)D`9P{uH`LX~ zLJn=YmEMtS>j(<8h3=P`)@fGNdD_7=?#l!l$Xn;*Hyw$#JsUK!hKw_k&AbvnyK;Mh zlkrU7MAI%G(^a|Q=U>(pU4GmB?rvs zRgY~vs14IL{Gz;zaGY8@Y)0A^nfX&Fbu5I*!}2sNYv`%PXJ-Yb_I`Akw_8M(b~)cO z+(-2sdJ`RB_n(dA(YT3#>!`!Mb0)6YR5`&$52X=k?x&B!*|e59=K=r%K~h`q@<&4!h-iLO%spKk3#nBu8rR{ zX>)&yM6u7k0+t`V5I9BkC?s1}Zd?2N5M9>E;0}2MYUz5~Gd-The7s4Vhu9EhXgc7? z$kZ3tP?QNNa7NtgW1rrC(8F_h8RQ#rr%FD?gH?k?#i7qLewd~epi(=ZkGFC4@La|4 z;3}%*`|8}^T>YGK>6_r^#wMMVc}WQ@CpIj zk5`mLO5!zMYe?+iKV^(k6sYRYg&hkh?7>Qba|cEN%Gjm@hs^{{6xpk{NaLFL?o6N=rLe_Hsd#A4M63zLNsKryQ-FXqWX?Jbn@zWZF z$*}2m6A%3=ZGECwU=gEtBh6Z*&3&n=?Cay`(c03^#!THr}B4HI_91bCM)X_u!Vz)8-(Lu3W0y@Z+NT2glC`U8f)1z+|e z0Y%=`Sj;u{<%()g|6Swajb+FE%wE^#I3!{Le_p!EvbSdoGYxljh4;NWy029&N+%mu zE1}kM?*KJ3D8vLTd9RrXNiI9?r)vZWCFzn5eNJ$tt}p;@Ogq*ewy#q@l)UmLql%Ip z!c&awwtmfV8~0V6rQ+$Wyl{OQLK+!QZe#x()zZRB;SkIN$be8IKGBmtg%7--p7iw{id! z=NJhTmBc^h@C-1fv&z zemlNzjh5}7sfuD0Gh~D|UuIwD8PyU_NpkSx*Pa+y1U#vj!rJP@p)(a@e(Iewa%^7 z1#q%zNtSHU)J_c8ADt(*MG&_`j#U$Ewzrs4UEvQ_PO(})_B>6HjRGRs~t%>MMYFhEJB{G(;|vOQGw!4fC`aH)nR3mFPVUjFR4SkGk4 z$V-1w%=lUP^j2;BrJ8^`ZRk<<&>Y=TvU&#xSW&^Mi-A#AX6QO62e?qEfM!aEYV{D7RZMpmFJ#V_^U>aR?NI;A^ z5^$$cGT}>pgmBn9sMb8_j9SQRQ@8AM{x}Xbmg}fRQc%ww!KvrUr3pK)a8wgJ{Buh)9U=xevN-;hiT(9 zHejQ$Zu73-x~c}NSY#B-Re2YWhbyC%Mt+Xn(7tNuUQmAdc3%~)U=l^!j6)eMAk8;2 z`%NL<7$?6?9G2?kW($XqdKS*DaZ;Uy)}M0{a!OD+ zK76DW>VBejDsUNDjPywj)$kU#TSIq!5pgXna@$cjm8jhGD|3C0aX86p1oiT-M1}L* zDygqn?b}N9n>XH!^CacWSY#FO@5-v=mY!&(ncnYzvMIZU*-3MS5IdhNEWB@T4+}j^R?nMAg12mKzkh{om^qpWQ6j* z8tm8(m^_t|=cz$piJM(3M8zI1K(2+nLk*UaOB)zXPxwP|l(3$*T&CGAzk&(_!}g{M zW}<)1#v$z6%f+c6e9wS2O4tmhq2|FLT(9@!YO?u5b!{ZXTffzq+bg>a>ga4;x~3an z0G#;I+qSCgbsm1poPn@&i{hx}q|eiI-N&D-*@$rJx^ym?P9(U$x{^cqWQ$B&79**0 z;TBh{AmcY-MjaLC@i8}1kd(UPAJH--dsZzG(8?Dkq#5<9O|o-{#Z`W5<^8o~f-peF-K_5IugL@T-RDqt%l3@TiC4 zW4HSAvhieU!YF*N$KZeoWn;9DKXkn|nb&rh{?rE=(D!*_rRG| zBU5$@q2Jl`^45si(wN(m^KVvEKB!+#WU*%VX;3#sj?uAWFq}fQky->%eE<-2#jae) zXW!ZAj#1_W1V?xzO@bbB*^;rVngS;CDEvAnQ9awMswWV^I8!X;S%<9#aVYEn*LAVI zVrJN6*dKGlRZm?n>Gm8=!{ZS^pOH!^pS1N^V?j~<1HB&RDZu&~ctY!jj<4-{CCqK* zXqM)d#Cuw?S-Pb2c$?pm=cryE>8>Sw7H6D_+WR@|UY-^#T)Ayqr1|ka@m6Q1c8t|* zEbu$h=Ql<}6U+}+u}pO?*U&6Wp5c{DiKpl*tBaQcF6U25y00J?o2u%!0cxUIssppy z>$vmoF7~jPkU$?}0hi-`vJrwP+!85Xf&7n-iAjpXf`S@9ZvNy@?Ap^Z4^ z6mb}akUzLUI7Qk_L7ueJTr^cSwp}?iD3vVxM?a?XO-(KBES<1N6T@tzMtygv>TI&N zY%8H?41I*iWx2pxFH9{F!@`U{V@!UPOW-pA#_-xz*<;O%s4 zm+R&*awS;YbnLZyZ9Qvi2l!yEBQL7ce5Q0&=a`9P@eWF@0oN*}f$T|SxF)AQep;&js->#xSM=RH>z#Gv$`i9an`0$ zg|x@VSXF~mq;2#~gpfT=gy1T^{mij-O`=aj+&2juq*Z<2IhLba;Er{!uj!<}5ZWB} zYNvFl2>St}4JYWR2(Rdb700SwV$*QXGfAA1C=fa$fKpOwlL?WihDtp&&~Y^vuKvhlIK+v*ZR-IN!S%iS86fcWq;DRyHKw+~L$?>mb{ zEZjFe&M%A(e*Lo5bA74n4s*vOR2lj1;0{ltX)`MAqX5M=FS7SrQ^POvYPP%j7>vp`Q5_Vz@PCQBs)8HYb=A^F7p46kiuoZY*b}WpP>=%E^a?H+wD0x!v)#wHWA`mau?@v~)&{FllRXCBvEaM9C&3!U-m>0%6*-X#N%^W`*RFmG ze;iFZ>c;!%iZ_88B=a3u)>$a3@{dHYudmXXU!&vmsaKG*ym=`>5>^?_&2HY1%=1a4 z!-gp8P!r z3KeyXBYXEemOinf8Ktz`GM6&Xjcuy3WxbLi_x@o{<}TA-iwWUIDc`yeTgvj)-{c(p z1BxaOjio{GS%T>@^}+$~;#Hye?l*T1xcsA>o0t^g&MrIMT|Bk#aRy;#-4k_ z{7RP3U$|0jaJ|0+J=)5TdjOJveRxb;vhgK0pzD65)k2o5kkR?!>Vi&)v}K5{uVj|> zK7gT5`-CuzT*|I_U)B8}?Yy+rwgKtvz?+UkuHL|OGK9lh^W>t8eMv6Tn@zMx7%^F% z@AXd^bF7_(wNp*}M1H>0bIt;One zP$Q;6C0fG_H{%YYk;hZObE*qgr9TxQ1V$*KSu@smJKe^|zk#EO0wbw3YsRkRt@N&i zzM%cOG{jlcFZP$4XQr#y&vUya4h`;3LsRxSt!Mrh?K*z);E5b!#HfFf<|grXnp6s4(r>28qLmwyO-?&{n)IaDmDznEbKsV~;cMmCc&9 zwky8Y+G4B_Ns*1@P(=DVbK3gi$}0};EYE}n!!d8S(_GWwHRw(n0k2=x;WfQ)bGK! zZF8bbokAh~?+RMEz@gLr#^XuE%oemG^nD$XP%7e?#u*#*V+C**Kpvg*MMbE-D6c(f zifC&i@+9?sW|`)D69!&a?+mV=Gt{;kauXiKNt`zfZ%FL-o)Ld=8!x(cIVw!kURIff1Iy40 zeb%wanS_2GzVhOmoHD?F#k{mR*)f+EEdPpCxuCU4+0v>^uv9{J1 zMMHp7iO1L`-TcPs5h!F62!b;{{`jnFAFkm>SOZvKc7(lrR@`Bl9>3fQpU@hBXPa#J zpZfZHuG)s#mRLGGau%Pc*eS@WQ)fjLz9p1Vu`8-Z3uC20fz<)(KAo9WM%pj@OWhkr zc)NYUB0R_cg}NX20qQ1ZHm;*%e_eh_CtCX-83F)5A7Jt|B-jUC+;WL)>V)))7oFcO0P~GH{(>wsJP| z^GEt2qo3F!B4OJ^r9QA7-q9xZoVHj^xFNnasK0uoFMQLx+a`)R7!AW+o_qVKk4*Sm zXuQLNWRt(+#TF$+&7MSZ`hO?xk!$d01eWE)H9;1AZ#cf2N{zPI-pr2zuy#zvE5-Mb zwL|!q>v$>i-nA89&K1O!PUrC7XNE!faB8&bv|ywQ!&yN<>nKbp8q_e|#e*K+6*v9! zmyXk-?r2s<2_l|^yUt^*3A*dF$OA9aPVHIP(x>6?O8h1Y5)nKJ-!8|DUltRGcQxg8 z!9qEgkw$7B@=tq)^^ z6%*UgM!f6qvM4E}LHqjyvwM7dE#5}hzx2p8LOk^xC??&ef{67A1#!LvaC0*|Q1&Td zNcm-DsxoElXs`n7D5fXEt|}a(b#y#s>9r1pj?1xcxHRc7*I%P^`{M&hRq|)0J=8$OV?B^af5j5 zO+|;CZ;nDksekbM%n`tEj%I5;Ii=ML+Fc08j6kKlvElRDmp?B-rp?W+cOoHYqt9N zH|Ir@La}(>;TXThhfZ^5dfzs4s$K^=U~>_cu`@|jx^OpGX{E=r#Z;1y!(yb-nK3$o zF?)UQgynjUKjwyW*XV|9z^#O`btbGRh&io`mnc`15V+Ri`}0Wp2PaEod4<8TUf(S# z=l%-_EL(S`Kp`B{Et0kblEy0<3w^3EI+Vc?7w}GdQU}piwua@DjDJ2iL$0P+ch^1J zjsh1d>>Ct;NEqf+_rUsG(NmA{D3}$x^jm79<5GP?;nlC3^FX(wl3{5R_MOqpz$p}r zy|JXa{#${%X1Vi?g$Z(MNUb3O>!@JxnP7>^c9- zOL6OzFZZQQ#dug9b{nOtMWRY#BB@1GSdA?K!gb?HW(WrE9UHgz%96V;sGM!Ls5LS; zLgIPI;0DI_Pc#HZ0x_$*U zHmuCR?d4~3tuFrZ$g!g|&nj9DunQ?Ne`i#_$!}dx4ODRvb_5_*QyGc+Rg%3!KW4U$ zry09;Ts`m?x$g_o{*BxyOK*4D|4F{HMuE`r=BV(NR_EiDNMn$5x@L$DAWdGD z_MUs$8)a215Z%33CtBgo|EiwW!^rH-Px-7YITtBJ8_Z`nSW;U{(@DBOkwy_2vuNjuEUlv6du zil+W=?9Ma-Fzf&#+Fs8(yP@2`bqB{jI>*oAV1vicRvx#PPmcV$WK^)7*FgE zTQ6iBypz{|m{*l~OTqF1v(?bBCwSXdP%zSj#HpyF7Srwb`Q~Qq=L9m@8xWy=qG1}y z5Rb~(E;*6HGwp{J2Iilnop9a~RMCWT+=jH`eY@#K=HfP+bVO?m;j}WQQzTC$+*eDsoy;<}sUJO3W4xf5(C?+sVd(oJRuDdNRhl z)+Eua>*hEcQs(=9Vqq#J)N%ebL@5~E-2eNSzKaw?!LMB;cD+VJR>WsO*L&GB@>U_e zU=T~;pUAyiyxZHi*E=sR*(&pp!F`+~wtXNVYSQ*WKVB(~mlYUruIa2#O5*#03==@c zryQ)}SAyUrGM3Y`RKs@F1SjGk!DFM??`K;p=V~pGZ~>Rc6ZjFqIc)JCB#YPbY|Zyj ziAPs9Pm*xfJS>%M@f^#7MNp|NeBZTr1O5rq(N?0MT!1po$*R3J#Hj<3Pr7-`5lVF@ zv2REKS+D@peoHm}R(vyT+S%Qz1;c4&$nK0)f~O)dHk2C_C@Dc3L>*;K5Mm`=Lliun z<*OtNd>hGxyPlIHq7&Sn5iDcjk9`%1JBdY+#?1Ua%%zK5o2CDBh<310TYITw2it(B zcaX=9`8G`g>(nuBSvBjli!gL9Z5-(FN91m6oL1k6uH~L^V%np9ThG9kH0X6tP@0H) zm1br6Mw~p##XsOjx{f77OHp2C%I-ZKE2q6&CtH{yONSf|4u1B|TKtZvF@^W?VjUQ< zC{WSB)7(So$Dknk=Mw!b5O2kf^lzukO?9zAC*mmTYM3V)ZwpyKRaxS`?6`11jYu zb=aDRaZ&+ew@!RjKn$r4ZV_SJE@~N%CKoss*zdEhUGDr~VskZ%_)FlNp9KR59+BA= zrbwD8|8e0jqMS8bO_cuV-*E7d~N}?}hksN%;;2V5j{v1ZB zo_p=5pL@M98qs;9p#q(skBppKWGz<^#FZ@KU|`2%|MB;gTA!m#qnt#{bqXB)5!8Yg zT$0>&LM9Gd;%U<7UbkM~EK4?&x;Y7z@6&P{xXUSRq!j-fZij2*CRv>AOvX4WgDoIi z?%WS@{z5D}f*LpdKLflW1>38or)YS`6>9tt;{fqz^ZO z8PyvGCiFg^S2pobPxhvCRg~)0_(vTF$wd~#2Qid6o zON7KMYQ3_7(UGDHn0K6n7bz+h>p5?qtw~;1kX4`d(8jqw^~Sy)#%ACID42c>S->}I z+*Vl`+xU~1dJ23vdQuF*9!gf%uW`^Ru59*(%Ttgd9A~}tWl|ZL7`j49j$H!vIW~o` zf_g0q;|%7<`C?Sl<@UQKr&^S4#mVPPev;_DmU@cG1+?X`pNis|L$0D)-p-N?q4o2X zc3fRwA{*J@D6=CxF8fmZN$W)kG`_Y6+vQ#X5RM*Cdk!bxX5EEVFBgN>9wx_>J+8Vx z?ovXn4o$PF!3%pL136U}zA9eLJJ}<;xHk#WNh>d#6n53TvEfF(5sGR{M%RKIJk7;wAie>;2O(Xw{qhPY>5@204V~&QLb7EHLwO1bPLzS za3LYN4tzTf>w?^x+pY-P8p2B;kUmHAgm<9IIm0ksG+0Sv#A2SbsGA*9ju21t79ele zH%y>3?&nC4DBm$GTHyOP`^!sCSaqi(zdJ86$^V7CO9)>{xj#s+7hE@UUR1WPv5U`b z(kbsnYJdk?>aZ56_X~3dhP+F?e2u_0U2Sx02?q`E-`6VGI_=4vc#{Fm)Pq=&jy&%S21ED+_$KZcy zju0(}F;8x!Z7I|9>=xY5sp*L**aG77yP0GqkJ-%r|JE0z*~RRel}{OPUo!E{-XptQp^dDb4Sg2=+Zc4z)UP{1 z)m`i^&a-vP(Q;N+ray3M73brd6vb1TR7Cl6}wmw3N5Jln3V zztgp#K#4RTmrBhemL7UvK#vH!;|^7|K30yIxSkl-id~PV4n61cTXYGX&$)aPC(D1t z^4i6HSMukc?iGJyd6Ug3y?XR_7pB8*qc$>r%qDtaxg9F;+;Y%UjMsvrBAh3<%sOpg zSU?mcdek#$NXh92(#;ffB9s)LY4kwk{XWO4vb~6}bC0u>DL02L9_IV-pw9_-wr?4{ z6~Ijn2W}YR#mJU@%?5c*J9`qUQsFl>SlU_F}EXeH-6wn)@}FurGiSA)c9- zGf5GATfs*R#;(jwF}1(kKCqbB~}e2!KB>49ZG>mu9zlWqJZ!dXx$Fe z4SBFfqs(unorzDPkg4n_NYE*~wt2eW0xILHyNB-vVYs$#FaKoz6pk3r`cWjtI#&V2 zdjfEI5F}i2x6~eJHJ<2BNS?)^HmM@?|OK98xw zV)h%&d^^TG^)-gO$Aa!w5z)yLI@KyTLz=$VMx7%2Ii(XT>rn+LBr2aAcH8 zB@Z~QQ)p9`t5GGtq*d4D!g=G=(0!_BDmqpd)?Sa%sF_a3qd6+}(s?o(lwPj;+-?wy zMDp=?;W*iS;L4rE9Qf7h9e6(sYwH_&^Suvei?U~HP~t$OcYrCtqhjzkDYo$Yp0z#> zh42HI4bNRQ$X+*!-{jz`#GvE!0}YlE#$*+4l!u)VhMC~Pxl}qSg^nJowzNQjD^C@WBjA50cJFw+%ewhDl&VQf4qwAJk zW|atrrR=TF9kx!9b4W>Wme3?lAWYK+xoh!vV7jbVc^J%xrF%X14l4o*?j)pxZ;wk~ z@CI5KCeR$OCr?!f21~)7UCT!9C@7x0nttKvKQu^zov z3IZ?6hANv*QxVm_8U}?DN0j(?-^;R1<0lv$pq_OeBNRO+`2c&$|VY%RTS znt>Z>dZ3kEtt3rd(CAoD@FFU2$qgJv`ztM<6qPeFCZIRAkcG!lW|xDQwSRrsCEVph zt}=rb%7&FJlrpW;UuTyNIdZUkQi6 zasDPa(z_rLoeMVZGiKnd=GU6m{~Q1F3Sl%j{wx1i;E*=_u6jJqabARBpB*qPvEK>;g<7d(@Hc}wHSHD1& z#~o^HwAG=Xkl6rhF?yCp(%x280P{f+7e^Mn@=Y1TltaXwy28B@Du7j_vOl*u9>zk! zmWcUWGQu>DC<>c)W-fZlzfE%%8B*{&gHt8BrNbS&9`@$l`se4Q5TEaQ z=zgWne`Q$8;lVjqmD4>X?5UGga|w1#PyANFLdbO&#>f!J6gI2 z4}M2Ld9w0m%C!ZWA#{FGDKkJU^TTw(x;h$r9~)AEoZke`OH)yyTBrq{o~@#M?-VGQ zzm+73#)0|F3>&AL2ppq5AeJgD)|IIVeeU^V`H0t z)83hTS5cE}PV{ntXYxKodJursb>Zjmzmnax{s!oxAo!A7AS)GIdDaw4U<+3}7e6`_ z0;y=b?2(2LZBfuy@dWeHvmQZcK<2*Cq{J}^`2I%mfRC|YUG_5!-RF|nGhU(Fg#n2w zp7CAS`EPKASsi<_*<~Y%&Oqej>Vi=^;~VDe&KEVPL`Vm~7m)84-X^maw5shtkN8B; zhTDy`LBOa4YQ*Bv@0Qo&4yW$1GMKdpWD(uBg@GOP@lCP^^((47jI98TP;buvz-Bn5L=&rhPJzxF>Wo$1WXfawkb0=zWOT%cCb zYdZ0BKKC|Qznvp%yA)9M#HDdj4M)8e?59q+L=vxM#0EdX29@+g9<*$1Zq#dp{)48|Zv*W3NXQewx*XmuE{X&f7 zVEJfXr+&kK6nV=x=m(KbS#}ZjLs{K6gU&w0t3l}QbGY?5ElQjx;w4Jld8Iiu-u|J` zmNZjPi}G3ex5orDXQKPrF0xZELr)>iDLl zVImp-k@bcG&s*FPJq&zdPZF(0FE|8u?bFt8NsBV(pqbJ#%aXeP7SxB88t4YKpDXT; z3A+QMcC)Esenzwvlr%%RLJ%(#0L`juKLZiXT=<32DzH}crye;Ay*-ud1zq#h;a zJri=)#&Ck&jjd~_uE|rbPL#Eyfs@;?BdzaIhNE$O#S)kr#a7vHDgtGWumn~Z-SP*& zyD>d@mr<5a4PR=>FHpRT?An=<=5%jjPzLk%4~oAoQWSO_pix$PLr?H zhKA3GKdUe?nhOgAb;wm{R^>_o&7XYmoJip2)g8>VPdzT?MmP3ZJCNe{p;){hs;BHi zMCVnFB6fP`3u`~D{Dy7u-WNR0yRAH$J1$k3NAzxmj04NgL2yk|=*Ft5tY6cY^hPf_ z!Th#Az+L&*gZZxKK6@(+0!vXld7^mQWXqJmVtJ}pE_0qN9jGdzUOAz8Hko~c$yYgY zO-naiJqNe>RKm|*I&$50_f>Jf4+E%z_mCYgArQuJ*U_Swl&=8!7ilJq9G$qT(cDRK zF>#p#n5-*4-=ZCZ>3<>jFe|K+V}U!FwSnPqaOpK5n#of%{v*r0xV>N&Yd<1A)#b0l zpOL`B%G9KMn!U|m*fSJjSbAX|2Vti9RL}M{j#+T)jB*P0e#q%~svo$I^!R)CUukXc z_{uspdojF|0>HY?*}|N2-dN?;(Hc>&bmD%~ZR{`c<(e4m%KnFTPZ8C|$TUFDl&kez zd@`23)(gwAV*d>C_hSrmKH5O2gF2q?bf5L6J-Qcp{VzSH?A>k*+7;5e4LCKTCh<4NKi}`w$_a^Fg$TBnx z*h(dKaVyY|$FzPyF~He>x%cKb*&9HGCn4`LRfa%*So`sz2cIzl;<8+-=11mdC#LJv zM{BlA`kCrqy$81IJZm!LC(o=cPiPb?;FiR9>Yy;@hx?z}{L;-@(9OE|@wt>pThKZN zdUQg1B!-B@{wzz+8J?J2ovCe_3n0N=kKw763mt4f5v;4}^C%21*MtT9L~gP_Bwq?c_7Lzp-{E`vKyb2m zd7kKr=&-E!g7jN=*jsO4$h}VCo`m-k%AbDXHPIUK(0zR933l*!pxah1pz0CPcJ&ay zP9l8~DYG#2S!&(rmsAqMx*C0Uv}o!z(pyOjY{G>~8z)cY7jT3^l(z@8YS|Cg3=+mp{IwAjC##qt7i^Yz)i+FTrQ!);`F=#ze8`osV3=Gx;BqbcG z$c<{z&m_BpS(304f|PT(qqQM143*0}-jBV!qGLfTt;nceA+5bC9$h)*SK4CTlb-@_ zT`GG6G(g4{`Gh8xZr`oq* z7AwKt=3tCBwiG7vAWchCc`8M|USPfWu#WPO>mZPXmKd-_(>lSpmR*>5 zn&Q3Oxzh^mb@6y1I~w)84NhRt3so0~D4fVq?T`ob9b=S7>{4pwVRy#*AY}5=$o}DJ zvAWB}Cvmz?P!>jjAJ^=49XW(x$;^HfmpN6hURKNK_V+sp!9jJStr$RG*V0?cok~AQ z>kYc$I3LU^K$aq=>w6CRRA_DwWIv<>O=cc#E?aWOor|=W-**Zndm>{|KgZSw%k+vun2ob~) z<7Pd53Ak{{OKupQ6J`=~<*y=Xo6l4HP0{yk*!rZtRGa1Tr8l?%Ra5nZYAsLSV`H7X&b#%-82^KpHW5#Re3G{5 zV`sXAhmvRP@$;*0Yew7xx^21iWZiD+?dplCu5rFDGsjCjsaPH$YpOGI`JMQ04ZWz7 z7C_n=-?;_YIvMD*q=$ESP!2^2ZD7-w^8J)l>*+7RuCOO9D@ZiK%cyUH@#&32cGJ=7 zms(=nJlvh3OA=tmF(fU@p_rl*8Cwf7j;^qu8cOQkgh#HL!OWaU4FNLL$F?q3tP?9k zk<^1~=950-&`M^M6>+4`+c&Q;O>0`xHE?$cNcre1_7{&ApR!N!hrbw-s+R&=t)Dp= zE2Z_t=2ky=v4Al(O#%!D^4QIK3WHqIe^J}4z1F>j_2fL_GJn@k4g)0|_eDr41FLi=rFZnuJ8HzvKuXQN@w(K3$ql2XoA`eWD1DuV5wRR2XlS7~U;35ZS#igWoo zWvTaQShr(KQ9cxj=?k-=@rzHy3fS8O{LzF?HXVn+F|*h$MSy)L+BGt9(5ls;g;olF zux2OeatJDbgKm+TLkQUst(5p|_r5Pvm^6Q<2TR-UeGJB(f0}SJt%oNqwX42KHf>qfWvr7;=bVyU7AmR?AMW zs>5tQBY|R)wKDli2as7R7>xeNEQ-J`J#Mts-28P-#27?;cEV&F)pVOzaQ0)P6SoGG z&ZK_@^lp1qTtGml{3D=CsC&OYuGgVXoU{D`{spx{d63n*^-J0uTT&`6&%mJ&Z5p+{ zeeWDovu@n{nTQo%D)bZ$HV6c8GxB(I&@zq^>~CjAFME$PkZq5KZ}O|zShTV6oO;wF zCOStB_ZJN+#qHD&R0o05Ko(?w(b+8P z&;m1a$@LkmCT~hbF#Uewh=)E3|X_Do{9)zi8lv(k5q+ zBTu&>c45vdUYfMXi zm6q%k2}`ecsA~G?CoJb13G7;0hG5zuP_nkWWbJIkf%2q=pX!-Gl zIqtv`RTFL=z7{bjtAjM0SzB7Sspwp1vr3X?oAp7|qW(vMF@axokynB}r3U1+7DhP- zxlPm7H=xhTkB6TP#r0_lPc$Zza80Y#d=_!H{r-cQ&9#;vsGinR25&aV0~R8ArbNEn zr$8{(-(uHrY~7w9czYkuVe6ezZOwe8hkD2cZFJ)cPCfU7-jm&7eO>i~sbJcS#5z z7M#rfY_C)AKzd>oyuOvI?nZzs&@o z|1r5P6p0X-{CP)mBjpP`73^QsG`sX)1dK+@{>1Fs`#+1-l_+*}!b1NItN*B{O8nK4i~iNj-+KWE)E< zWEYX_SxWXs*2j=73{l3uL`I@8vP)S;_BG-BXY}-RmKW#Ed2z05Ud@}Cxvy*P`}hC; zKA-P_xU}P^xp{YQV0oiFTQ}^kK60Ak!Da4-N#gkh1WCCPLVn`of_<8a>#TE4?zs^A)FuY_oRQ+z=ew-r>6_|3U#D;9>?lz(N)DiJD2G_qO#!b|-@$~K(0}HG;0T3Z z=euKJ4|wyT_Var&c5<6DQcXB+1IDKyJbb@vD(h?I+_-G4tqbJfk>2y?Qvx&>(n#=M%>_ z^33gCSWcrUlX%ZX`xmipO(reAKQb8VOTx`1dJZoYztggR!7 zPab24zHETV?=EiJDm+k$qLM#htk&yKF+;7zChpqWbhH&kTJ!Zi5y#NhzzGEf662_c z-q}g0fE=L@4jXG(F94GIIXu3>m3Nn-DY}`DDkLn-$zfmTM52ZxN`6bK_tOif(yjgF zfu=y_z{Pt4=5AGGFCqugfGzMymZz@Q`!+z}9gF0=o|G?mw&wF$zzkZzn8e5uiFK?$gHY&LAE8F%Gz)6cG%KMv8!lR%$3 zeims!buRD010j-9?93^huk0Zl@vBL*Z)Kugp0R`LnOh)X-B&VvC*7Wl(Cr|lZ@}$_ zJ@>)TOVpYA*|FuyN$vjzPuWz&_cJ`IcoM9m$t16O$RQ?Rfm5N(DCyijn-ilwHQoN11+`~v0ZnlWTqGxZEx<%TEc^%(WZKay<(-p z4#ICVid3!Ip)ql5=M7MLmwq3=B^gPxGL`1_o<4eZqo0zs9kW-f+(#A@HZ!jeT3y?s zh@I2I^M)^+|K?7T<{NYL0tS>KHX7bGU^Bq@otb<16`#VR>&XWILBfWvie5dK#S8q` zKBxD9n`*V_qUyVZ*VBneqmAIZGWeP>j!(5bd%Lf%>yAo9GXd)VPkFV%=Sfow#lk}? zW^~yGqAUQr$6sh6CHb;0r?RrJCSNL82jR3f>$2a$E`XsUoRQrZUoFBMB~})D3lUOG z*_x@P%pZ96e9!h0FmborfQg%DFNUsB*D=@VO4HV1z}Wfdsdf8*eIA;{uUnJ@Bgyo4 z3?P3oC+}2lC2Pf$g$lLHv49kDI}=o?$+Fg3#drdf8^a~~N_}hj6j0|yo0g6tzjD^? zk>x4?rv6>zOrZDS3bdl@75CIByD#`1&Q0z)5y716C5Ous{8pK$4^)m15h)spM?^Hl z#f1tKGbHZPs}?3aU)Gw~WDvQJ$)}5aX+q>-Z`d}{DXYz6R z5~mak&4ZMc9oOE~^P*N??#`6HJ6#o99#5f2Vq4vBCF{`k@nA(rzI&5)%L$B6m@3~;N>nCv^u2e2GSae`^Tq4gHVKx8(kpLS zl}kgheE|Wd4>}S2TMmKJD(WUOl_wxysghbAP@v z|2#;pwQ|>=&&fKqkl-(QX3Y-DrkUCHjQUeyW!&uG+`M`lPZ0fctqz*ZwI2s7T6HSl z$Dr~`b>S^y*L%IsV~aI{y%5^QuZTZ0X=+{dV0mIfNLwB{6-`nCc`G1BAQy{paqgzu zbjloP>7qik)t5gWLJ!aot^4M=Q8!&_MEQ$7ix?>XMPkL&d9 zqhfK2=>f84rcae3KD5Go-FbRP*vTX)s2J7tss4)PvnSCIsp>8s45t;7hG2<|uErG8 zHQ?kFmQK1nduldsnQM@7s9z;z#Vb`0J(`B9J6X&I&e0Y%)eG&};wopprs7}{bPv-e zdznud1kXgjfBTres-_w8e)9&RBQ4D7_R#(8f!r59AIy|_wx@Yf!#0cE;V;&w=VVRL z-gZrWs=(Md^SIMEL)x}YPJzf20<_Mh?w2jg?2E1mr&@Eyzl`{IZHl@*&pwA3(iJ6X zQ3j}abW_nwsy9c7q}JcjhlE@%vau0V zCD4rUV9$~iz;5jtY3nBz0vqTx)0*{faeG18FOsurcc&f)Vr@08g^9FR# z!WHE_fM#sjNr+AB{-nwyjZCegBfltVif3ya&SCoR1<&6qY_1N`0EC468qfXh?f<8y zw!gn?>bzO?-Br)=W_4Av(Zaa(X1b1e%Z8CJni(8vY(9c^7)apW&lS|jESo9*bYbKB z$w5UlC`vnlbwgxqD@Mff-l4XC=Sx2+b3-<-_?gI?2n%`ye)}sj;cF&X4u5MAuBkVxDazsvdZ=i%00IBURB4gIOzww}3%BZCfe~tiqr-yUN zHYCGCFm|HKB+4&S!lm{V8!0i&#MBu*i3RHLqpMyE0v zrddzy)4>I6-ebR+-ZO0kqXva7R22Gm)R4U7Pme>Y=4XOFG^PrW+{N#6B+pz7L%e&v zY?z(kC8)RK`OhJOR`NqS|0olok)a;OnZ)i?V%m9aeY71IPoJx;7iu3Cd2 zp9suy$CxM?+2$Kx^=Q#Y?|y|pvV|=B_->VKM3~~23o3tY;kCt>D?_#iP6|^NPlN!Y z?A6V)x|VoKf~b#)L!-IIy4zhO<`t7KLKVIa&brn6Tv>q za9)(ZQ-1JAN&UrieiE=iMfMMPU?&AE`}&f5x+4;AJ~Lokngls$RL+!MV{)PSXv0>; z!WxNZnDj71*64Nch@VUIviV=t5o*x9c_~TXHzsJxKO>2w1d(4Y&sJbo(=Faq^v#5( zpY3&x@jfs0L(FpZab@dTL+*8II4t!&|1oxqaT>2sr~Jns{Y374SMs%w6x_JzAAx)O z)te^^xNg%HxjhpP^FcRTnE&;=#DjM<4}bd+>jE02*3wp;$L=}Rf0Xq7xtsn1eYscR zFsIp9?C*16QmJ#ykG#-3tah#hA#5z~%r>0!2c-v5Gu50QGb}=3J-e1KK=u0DNwG46 zt8-c4Xi2xpa_?MLBFw~940@<5` zE14mS_q1Xm=rkl*fT@`qTWf|(S1*(t+78|}dsSIlEzcK9Tc=!W9)z5#C;BRSD6Pfn zB9aE_#W%hE@QrWHnQUXtZ+9}Z%WrzOMZP)Ej#hwDn%M}qLgx1A(nsmjaS^R3bX;J= z>2!&+8BecNeD=Pa7fK6`(A7KCplynlae{mca0P`xiraL>_20^88t0$S%vW*ZI?vVW zk;rLCGt9|ESo9soTr%ZWMSz5NBTg^^=&tZSPwi`S(C!w0-ad#a&X)d~0u!7D~Zf5h{wcL9IJ&5b&%PHqTed+Xo9M3%3Z@AYSI_{=A pM@{*dp9KVz=hgqJS#)!kdU3oU#)PJ-8FVRAX{qa~6{%P}_y?!Lz3l)1 literal 0 HcmV?d00001 diff --git a/include/vector.h b/include/vector.h index a59d3a9..2359595 100644 --- a/include/vector.h +++ b/include/vector.h @@ -7,6 +7,17 @@ #include // malloc, realloc, free #include // std::bad_alloc + + + + + + + +//? Note: The vector is very inconsistant, but is on average %19 faster + + + // GCC/Clang helpers for inlining and cold paths #if defined(__GNUC__) #define UFV_ALWAYS_INLINE inline __attribute__((always_inline)) diff --git a/src/test.cpp b/src/test.cpp index 34be1d8..d37556c 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -3,19 +3,26 @@ #include #include #include +#include +#include #include "vector.h" using namespace std; using namespace std::chrono; -static constexpr size_t N = 100'000'000; -static constexpr int R = 3; +static constexpr size_t N = 100'000'000; +static constexpr int SHORT_RUNS = 3; +static constexpr int LONG_RUNS = 10; constexpr const char* COLOR_RESET = "\033[0m"; constexpr const char* COLOR_RED = "\033[31m"; constexpr const char* COLOR_GREEN = "\033[32m"; +bool longMode = false; +double total_speedup = 0; +int speedup_count = 0; + template double run_bench(F&& fn) { auto start = steady_clock::now(); @@ -24,29 +31,57 @@ double run_bench(F&& fn) { return duration_cast>(end - start).count(); } -template -double run_avg(F&& fn) { - double total = 0.0; - for (int i = 0; i < R; ++i) { - total += run_bench(fn); - } - return total / R; +struct Stats { + double mean{}, min{}, max{}, stddev{}; +}; + +Stats compute_stats(const std::vector& samples) { + Stats s{}; + if (samples.empty()) return s; + s.min = *min_element(samples.begin(), samples.end()); + s.max = *max_element(samples.begin(), samples.end()); + double sum = 0; + for (double v : samples) sum += v; + s.mean = sum / samples.size(); + for (double v : samples) s.stddev += (v - s.mean) * (v - s.mean); + s.stddev = sqrt(s.stddev / samples.size()); + return s; } -void print_test(const std::string& name, double std_t, double fast_t) { - double speedup = std_t / fast_t; - bool passed = fast_t < std_t; - const char* status_col = passed ? COLOR_GREEN : COLOR_RED; - const char* status_str = passed ? "[PASS]" : "[FAIL]"; +template +Stats run_all(F&& fn, int runs) { + std::vector results; + for (int i = 0; i < runs; ++i) + results.push_back(run_bench(fn)); + return compute_stats(results); +} - cout << status_col << status_str << COLOR_RESET - << ' ' << std::left << std::setw(27) << name - << " | std: " << std::right << std::setw(7) << fixed << setprecision(2) << std_t << "ms" - << " | fast: " << setw(7) << fast_t << "ms" - << " | x" << status_col << setw(5) << fixed << setprecision(2) << speedup << COLOR_RESET +void print_test(const std::string& name, Stats std_stats, Stats fast_stats) { + double speedup = std_stats.mean / fast_stats.mean; + bool passed = fast_stats.mean < std_stats.mean; + const char* color = passed ? COLOR_GREEN : COLOR_RED; + const char* status = passed ? "[PASS]" : "[FAIL]"; + + total_speedup += speedup; + ++speedup_count; + + cout << color << status << COLOR_RESET + << " " << left << setw(27) << name + << " | std: " << right << setw(7) << fixed << setprecision(2) << std_stats.mean << "ms" + << " ±" << setw(5) << std_stats.stddev + << " | fast: " << setw(7) << fast_stats.mean << "ms" + << " ±" << setw(5) << fast_stats.stddev + << " | x" << color << setw(6) << setprecision(2) << speedup << COLOR_RESET << '\n'; } +void run_test(const string& name, auto std_fn, auto fast_fn) { + int R = longMode ? LONG_RUNS : SHORT_RUNS; + auto std_stats = run_all(std_fn, R); + auto fast_stats = run_all(fast_fn, R); + print_test(name, std_stats, fast_stats); +} + struct S { int x, y; S(int a, int b): x(a), y(b) {} @@ -55,97 +90,98 @@ struct S { }; void TestIntPush_NoReserve() { - auto std_fn = []() { - vector v; - for (size_t i = 0; i < N; ++i) v.push_back(int(i)); - }; - auto fast_fn = []() { - Vector v; - for (size_t i = 0; i < N; ++i) v.push_back(int(i)); - }; - double t1 = run_avg(std_fn); - double t2 = run_avg(fast_fn); - print_test("IntPush_NoReserve", t1, t2); + run_test("IntPush_NoReserve", + [] { + vector v; + for (size_t i = 0; i < N; ++i) v.push_back(int(i)); + }, + [] { + Vector v; + for (size_t i = 0; i < N; ++i) v.push_back(int(i)); + }); } void TestIntPush_WithReserve() { - auto std_fn = []() { - vector v; v.reserve(N); - for (size_t i = 0; i < N; ++i) v.push_back(int(i)); - }; - auto fast_fn = []() { - Vector v; v.reserve(N); - for (size_t i = 0; i < N; ++i) v.push_back(int(i)); - }; - double t1 = run_avg(std_fn); - double t2 = run_avg(fast_fn); - print_test("IntPush_WithReserve", t1, t2); + run_test("IntPush_WithReserve", + [] { + vector v; v.reserve(N); + for (size_t i = 0; i < N; ++i) v.push_back(int(i)); + }, + [] { + Vector v; v.reserve(N); + for (size_t i = 0; i < N; ++i) v.push_back(int(i)); + }); } void TestIntEmplace_NoReserve() { - auto std_fn = []() { - vector v; - for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); - }; - auto fast_fn = []() { - Vector v; - for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); - }; - double t1 = run_avg(std_fn); - double t2 = run_avg(fast_fn); - print_test("IntEmplace_NoReserve", t1, t2); + run_test("IntEmplace_NoReserve", + [] { + vector v; + for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); + }, + [] { + Vector v; + for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); + }); } void TestIntEmplace_WithReserve() { - auto std_fn = []() { - vector v; v.reserve(N); - for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); - }; - auto fast_fn = []() { - Vector v; v.reserve(N); - for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); - }; - double t1 = run_avg(std_fn); - double t2 = run_avg(fast_fn); - print_test("IntEmplace_WithReserve", t1, t2); + run_test("IntEmplace_WithReserve", + [] { + vector v; v.reserve(N); + for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); + }, + [] { + Vector v; v.reserve(N); + for (size_t i = 0; i < N; ++i) v.emplace_back(int(i)); + }); } void TestNonTrivialPush_NoReserve() { - auto std_fn = []() { - vector v; - for (size_t i = 0; i < N/10; ++i) v.push_back(S(int(i), int(i))); - }; - auto fast_fn = []() { - Vector v; - for (size_t i = 0; i < N/10; ++i) v.push_back(S(int(i), int(i))); - }; - double t1 = run_avg(std_fn); - double t2 = run_avg(fast_fn); - print_test("NonTrivialPush_NoReserve", t1, t2); + run_test("NonTrivialPush_NoReserve", + [] { + vector v; + for (size_t i = 0; i < N / 10; ++i) v.push_back(S(int(i), int(i))); + }, + [] { + Vector v; + for (size_t i = 0; i < N / 10; ++i) v.push_back(S(int(i), int(i))); + }); } void TestNonTrivialPush_WithReserve() { - auto std_fn = []() { - vector v; v.reserve(N/10); - for (size_t i = 0; i < N/10; ++i) v.push_back(S(int(i), int(i))); - }; - auto fast_fn = []() { - Vector v; v.reserve(N/10); - for (size_t i = 0; i < N/10; ++i) v.push_back(S(int(i), int(i))); - }; - double t1 = run_avg(std_fn); - double t2 = run_avg(fast_fn); - print_test("NonTrivialPush_WithReserve", t1, t2); + run_test("NonTrivialPush_WithReserve", + [] { + vector v; v.reserve(N / 10); + for (size_t i = 0; i < N / 10; ++i) v.push_back(S(int(i), int(i))); + }, + [] { + Vector v; v.reserve(N / 10); + for (size_t i = 0; i < N / 10; ++i) v.push_back(S(int(i), int(i))); + }); } -int main() { +int main(int argc, char** argv) { + if (argc > 1 && std::string(argv[1]) == "-l") longMode = true; + + int R = longMode ? LONG_RUNS : SHORT_RUNS; cout << "\n=== Running Speed Tests (N=" << N << ", runs=" << R << ") ===\n\n"; + TestIntPush_NoReserve(); TestIntPush_WithReserve(); TestIntEmplace_NoReserve(); TestIntEmplace_WithReserve(); TestNonTrivialPush_NoReserve(); TestNonTrivialPush_WithReserve(); + + if (longMode) { + double avg_speedup = total_speedup / speedup_count; + cout << "\nOverall average speedup: " + << (avg_speedup > 1.0 ? COLOR_GREEN : COLOR_RED) + << "x" << fixed << setprecision(2) << avg_speedup + << COLOR_RESET << std::endl; + } + cout << "\n"; return 0; }