From 26e9a848dd1db14a06212a216f7db16f222e6925 Mon Sep 17 00:00:00 2001 From: Surma Date: Wed, 19 Jun 2019 00:25:09 +0100 Subject: [PATCH] Run wasm-opt on hqx module --- codecs/hqx/Dockerfile | 7 ++++++- codecs/hqx/build.sh | 2 ++ codecs/hqx/loading_benchmark.js | 11 +++++++++++ codecs/hqx/pkg/squooshhqx_bg.wasm | Bin 309510 -> 309513 bytes 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 codecs/hqx/loading_benchmark.js diff --git a/codecs/hqx/Dockerfile b/codecs/hqx/Dockerfile index 1142b581..e48f73b2 100644 --- a/codecs/hqx/Dockerfile +++ b/codecs/hqx/Dockerfile @@ -14,5 +14,10 @@ RUN rustup install nightly && \ cargo install wasm-pack COPY --from=0 /opt/wabt /opt/wabt -ENV PATH="/opt/wabt/bin:${PATH}" + +RUN mkdir /opt/binaryen && \ + curl -L https://github.com/WebAssembly/binaryen/releases/download/1.38.32/binaryen-1.38.32-x86-linux.tar.gz | tar -xzf - -C /opt/binaryen --strip 1 + +ENV PATH="/opt/binaryen:/opt/wabt/bin:${PATH}" + WORKDIR /src diff --git a/codecs/hqx/build.sh b/codecs/hqx/build.sh index 413db29d..fd06ec21 100755 --- a/codecs/hqx/build.sh +++ b/codecs/hqx/build.sh @@ -8,6 +8,8 @@ echo "=============================================" ( rustup run nightly \ wasm-pack build --target no-modules + mv pkg/squooshhqx_bg.wasm pkg/squooshhqx_bg.unopt.wasm + wasm-opt -Os --no-validation pkg/squooshhqx_bg.unopt.wasm -o pkg/squooshhqx_bg.wasm wasm-strip pkg/squooshhqx_bg.wasm rm pkg/.gitignore ) diff --git a/codecs/hqx/loading_benchmark.js b/codecs/hqx/loading_benchmark.js new file mode 100644 index 00000000..ea9624ec --- /dev/null +++ b/codecs/hqx/loading_benchmark.js @@ -0,0 +1,11 @@ +// THIS IS NOT A NODE SCRIPT +// This is a d8 script. Please install jsvu[1] and install v8. +// Then run `npm run --silent benchmark`. +// [1]: https://github.com/GoogleChromeLabs/jsvu + +async function init() { + const start = Date.now(); + const module = await WebAssembly.compile(readbuffer("pkg/squooshhqx_bg.wasm")); + print(`${Date.now()/1000 - start/1000}`); +} +init().catch(e => console.error(e.stack)); \ No newline at end of file diff --git a/codecs/hqx/pkg/squooshhqx_bg.wasm b/codecs/hqx/pkg/squooshhqx_bg.wasm index b180905b2da208c023ab4032d3c522bc3fcf4c65..f986ea0b4e54a2f506bc792db27e07d33e1b826c 100644 GIT binary patch delta 46740 zcmd6Q3$P?-b>8$$-^cE~SG!0&Rv6kN|0gAr&-KkPwTlWhJ~q_O2v$CCq}L zkQ6yDyA@;e%A;_*$}R`0l5}FZ3{@u8F%{b(xT=$? zSUKl(fB&4*J^#$yxmT{J>T>to{vYT0edqss?&V|Ox%i)a=i(!syY9a?=yW>42M*sE zM)Y6j&TbS1(IZFBzboibw5?)@~r-bAe)udDlg`SgtSMoN-ao;Fl?$tRTb&{F@@7GC{jj9899q|8Tl>php6xx zq(c-9O&R$u+TRel`icbhyahJaer#6+oF%0P!5B2=yhqX%dbP@+sD>kxbpFcmC!N2F z+DV7}p(=_dNoUH)pLAme30RbA(DI`-Bb`fb0XjG(Tz zMNqH+y&Gkuo+KLSQjLMr466BOuVu7!6;1eOhDBbab7j=7B4%zlE7LS?t0-c;KL+mS zaj&R_!c3Y|MoU)_@sGjof}sHQQEFW9C!Mj#^b4M(Q#n`h57=mT*sVNls>pOe(~_QT%w+J;45q}7YaRR3ewdj-T*qyKe-pX%SRQ=B>Hrp zYr(&3d+D0=h=26)*A$q60)twDMljrTDbkDJiJaOYOwU^3pWUbJtgLMZ87fTaa=|~s z!U(^)yqK=HTotvd4V^@)iC1>T(i!s{^r20Oe_mZ@hS}AG(wy6JeMT`y>voW_QNo%+ zFzs2CXaLGtz_?NiV?T=Oyf^yDuCPvaeNAoZ#5(35W1hcRn_-@pHjQTLjo3MF~NQ62ds*Omz*62B30w zT(N@06~ZL06xK|y*7i^3Q{o?UK^b$5u$&MJ1ZnmWh`kpj??Xjd@lU2RBj!{`y(TOy zu&cKyXB=xeG2HpbROJi^)0&Ffz#KnKi9xVI48ol87npyhhQD2HlSyjMUTZfR?sG!V ztTuPlbH!HOzwsoPw_vsTk!7sA0@Fzd=D2;h-Ur|xdji+`6f7WmGqOojj_?mQY9|v) zYW#D|Kif4Z??X1J#4y$0#u6A*-M<-*Z{pDbSvy7xcg1%y((0Ac@= z&KZ<`UY~#3Kn264g@#~~uFZPLz;-&qAf1lHKRN>!JWi#0&R7ev&L6#zXCL98La*RI zkNKA?y|-t^AlV0Q97{(J{>fN^gZ$=|tSMG7wpPo5O7v=N@W(y`yu?2Um;eykTvK|6 zOZ>_ief-WcE{VpvSTYu1p8ud_YD)SA*gzId7BGnFDRJf>e|Agb?!3hi59LxV2-srS zf`-=)uKCA!*dMS`xAcYXIE>+$AtNnV4wd^iSTxq-jN#@QLCP9)jN$&2$y;hWXGM>a zQ-PIA47@DTW z-Tbn{xtj$jCkDCmk3n@4{zRv`KkrS53Y|>37GgFC`s8x{f#gqUQ^^LP3+87SE*8N& zW01L5OV#H^qTzxTEm)yahtNmVhG6{TR;%vcOu)1-eG*@OEeON&XaW3V!=mY~1BrAHG&%c>eHZnnhuj(HsPb$WbG1Q*2|CLApH}Ii4vjuD z5>@MyX^8h<#^u##hid*Q^e2f*7GP_kPrP#cg%N&m^Y?)*Y@6^;$~oh9)x@%lhw~Qy zU}>AEkp!LEfC zN*1Q%S^a?l{R=yp z4un62W7ZVqYO^-dACok^X&TO)Rlo}VK6zo-qt&W(B>oXUVr@SenY1;Xf2r?)%=y_Q zx9RVIdiDLAElQ=y5*@stIGRVoxh!3)%AMEt`g0c^@xz&OE5&}*)r6fEFLYOYUA z;jn;oZ1N_s@4D7n+#AvI4rN{FA2NnsK zIK4U5A(&JbP4PtfK$i>p7$BWLo=6|)=4dxYHitFR#VSpPZ6ok8g@lJeNc9}k2d1nX z^vRtd{KFDfXmbgkEC})95@)Lh^-M!|%Cy<-*ZkA29K>ihzgUWo_q8b*tF`XzCg&eP zQRr<@v~_9c5(6kIr|HaqD4XXpOScFXry>ohZM{+BLJJU5J*SOR+jW;Bfq-DnD9YQ! zKL)7U2UfU_ibYwZ%Olr0`hE&9LuXH~gH@u+U|CCq?>UnXnhRPiP}>=m(?Xz^N+qP zFz%M{Lpc+@SeI*}&xffIv~puDh^CHz{KT7S<#L@R!ddV_$-^Ls+AzG;^tfT==QRK9 zx#`Ju2UKXmC|B~6+NaU54Q})G7OsV@nGQt39>xOvg4NlYGJ9Z-qgvq~Q&Y%{iYm45 z{fS|UpfpIQ^+~l*<)-5w{mAIE_ZsI^hvBBA=mf6$M;}=I-LN?yCfcbpx?xrU=x7Xz za_ueCJmz(YN+1etM4|;_QSQBX6oXL6lT2s+Npz;BEWlfSiwqQ)cZA7(;WdKLgu&<~I70+I9NX zUUmNAaZXhh5XwE>?Q!=hE^+#3bd+n=74T22A0_%mQB=SR$yby`Qr1pwT^=b9L*Dz7 zJAXod{<_e|g{9oh@p4J0gXce5MeT+PzE4;m2y@O>I3`JB;sl+jiB8nXl?(GvuKPvT znMm~Xslx9Pf8ms^f=9gSlB)T~)KskXHZ|oBrLL)=q!zqDLH3;-DMX(0kKdwpyc!l& zXC?#cGYk^`!3vost#(6>VPkKe%{aDs<`Dn*le29r&YlT76~dg{#4rgS1dvR{Kc3{| z+~kd5xT(vpCBbM}{+V(zB^66KdQ|HK;H3f*_LLj;#dAhzopR}+X_BWl3{ z08uj&{rxvhP3=|`ll;tNEHb@gTW$E%b(O+DVk?Z;t3|sr2>g?3xE?cBB1Zo1q2%0z zMX~PU#2^=BWsaCx@DS&Lc?q1Z@cq(*gXa5+U*eX$F|)L=$L=} zZFj7X)`spA%~>f6ZX^9ZIcw%$!)WC&ifzeBWw*J(@rh*+A$XnhWQOraNm6YlY8;rR79yiHWBMHO2Pt4 zFExS&M0^mW;vfDbh^yq?d=LcHpXutK@oIoe3d+d=%JEOCEgI`gotwk;$6;Jeaof!T z0wF$~dUswv%KQVQGuZ7An)|?II*yoCa7F2>FS>tYTj9r8Lu$MIaIVu?VhYSp)+T=( z=~eurU6(N*Vk1B6&FF@`2DN*PW8j}eSHH2S1sN``{sLPZF%n2XSMGgHNw_{SKr&?K6(Umaq7{_(bmiyE%=8EZbQe$4})nB{y%a_2nE-M>Az zzveO7)!c8FPcr`?dKN#JD#1((M#VtS$OjP$86+pIA@TfK8X~% zR;0Od*69{Aj?7txQ555h>r4;c?tm~S*L}M&$j8sbKe^^wf2XuyqqIoUanDodT+Kf^ z&m`$^@BEx3UDatxqdhtQc$01^e)h6Qqs?LdK^aMF11Q*E@b^|Ieg0bKOg5!NmA8;* z{t7kDvK^U*$^!6Oz5iiv!3zZo*eKCLs)sGun3%kug7Dy<{e}28XCbUoyAU$@`v;I_ zxK4wFx#-KaORVSMVdg{A%NpgP(u+AJ7Yybkx>o$TV0@owl$k&d^Un;!r{)Y>G{bOj z${53IyK(>KErMkXpOR;F1Dxxqa1l)Sr_{E_Yy=V`(Sj+0T(=UYlkiuy?Ia?`VQl0N zE96=zmvHy2Um=KSBY!obH_pd(JbT8yo-sKju`CX~Ul*F9`q0IcdHZ z+V}xy2}nR7RG+vpX4pemOMT5-y=?>k7)MV8G~AxRi|Tp{y_p+y>*SJIvvHS z&OcghlXRx%O|?E_2*N+o31GS1)FI|1ElrUN^V|sj$)OOpT2c{M+vMhgr>@00LfyZa zgN>*F$Y`@3%xiOmQ=3^Bg1JgFwGx@L%$VC0Ofq+Au?}*g@ijGqfq4DIWY(l8Tkn77 zKq_1!MLGYHq>ZRpV9d(B9KV0s)(#a>RO9NGQ=Dh$W_EMU@8YFj4KUVD_(#GI-?t-< zCvwVxP?}bYgNKb$9myGCmA`)ti^__VD_eK-X(;TPaCeT6n9aGxu7>gZA2tG$1iK*^ zFj-W&)&T*|n(EVve-^LTiHG;6Tqoxrt{fz1#sZuw?;!9bVIYSPb8ceTazz=b6(&{5 z7^v5dIYe$FjV!4a46;ZhF~_SZz5n5j5F^vLONru%X>&zWJTaQife$waEuHXB8%5z^ zu?T`#1flH`JQ0^bnCBAk&oa?l&?PggNb!$Q4g$7JAGk~vMeQ;|jHF&6EP68H>WA;m z`~G$y?W4@A!9Q|F1?W2;hAa;6&re~ZxmjW{5fP#XmK+?MOxpW@G7qgV?5 z^TVS-~NLaa&5T0EL#EpJE}cHw-KidyX*$bU zs4SwRgBFD7@Fd|3giGX2p5veK5}31$7aF;#`6t(0JBN&%McP)=q?$-tGU5!Z7l?-b z)QWXc`XPQ!20~M*2na6c=AC~yDhQZig0WUEV*!9D9D$AO;p|Bowq18krF;ep{1a=W zOUy?Cji7g3s^M&;nL7W7-mul^ooQsr^;K%2kK^K0EFd_JD)N&|H0H9#q)a1AqSMh_ zzqVTzY&0hqu+M}EW@v-4zAz->{@TWq1c7m zFudjM3IB*wF-}Mw!W`w`l6I5fp6L9sxe&2av5{!EUDwB+bHSja@Aho|`yZs1|4d+z zF4r_wYGG=*R{T@wakdpzSlNI|ege-Gn$*RO@O}H#jwdPCuHzq5<87?OBvaNi?v2by=&IPV}&-)aJ#yjN0LMM+_bY zA=PtC21;f@g;ED%l4f%M)?!pQiB*Ll7P+YSUlN;*baFR+&r8?*GpE&p3Z_=tbGGXs zr`)ALXw$f}fm}b~pXGDdlUkFi9&49aK#aJhhk1gC(5}#~Gtq1N5p&uuLBWelASgF7 z|Fkx8og}9g?mi8~FEeMVauxp=?Mwrc>4tMDC}11l;7r#_&VqaYW6YbXs+`*v)U@p% zsL%)=^ADo8XrH6;V+IAX=MZsmBLuA+{r;&AzsbP17hr^V0fIkXV{Wd1s2K~+R0wkZ z@nc}YwgTzo8UccVy=A;mc^mvQMsZ4~Uu%GY$8-eE!XaMUOLq@C$Q7k(tW2?^88HqZzvz2m{1)K`zuOd~};q!0WK@^rr zx2$}i+pKI$4 z@E5FvV4!k=8t0R&uTdiYnZb@;a@^%_`A9Cvl`Wiw-z=;6CvVj_0%1>!j9MVaF((ED zQ`YT{1G`FQL6FRH=bxC74p`|sEfQI4@Gmu;$qOW`-F`=dCyjj~+7-6O`dx+DDAl_z z*yb)~1M$xiM(m;B>kkqEt%ZNuVS!6_lbi5xyNa+{rrjtG?t*_xeuNcbP04L;!?050 zt2@zgwHX!69nhFB#j!y4^ZM`a!7du#C&&nX6Rh7iJ@JRXq;M*rZjud=il^3bNj^xeK6Si*<*n$ z5&khM?4o#GmdptR+?{J@P2nGuXs#Rbf(3-quUw+v!>0PxYdYn%L;Vp~IsahSgwqzP zrbf^q@~e>Z9B68)NJrcTJX$c~nXW1SMq{I?A=K%;?9Nl~>Hg&5?tv4dm;Gw5|MAlo zx;v*Y^uBrn{bYxJa!C?=cIOQ@g)a>*e#!Cfk$%wc(YNmP{gq+&hMl|K5%#)U{T}^$ zt3%&{8@F~Id}nyJ8~oJhKYoAsnzscV`gt%sa$&GC{O+$m-5IP7JA*a)TJK)pyS~3V zIM81m1{Vgs?)9|h>J^>N_Q7H2?KJ7&@Y&!agMI3%;Hh3joYxtMJO|s5U{mZ92H*5v8B5kzVKX_%Q zGkgmzO;h_D{jK39&60hpwW=*&dNMpdI(;&HQLsMx@X7G97p`v%|GYEU*bFylp=UZb zZUyv@!RYam;R`mpv?(k6Z12SAcTR?bjUIlmc4G8x`a#eeZM`cz9np@Y#eMG^b{`zB z-T#%hK1Bchht7`=4h?&Q9xb=A(eDl~J>CuJ8@uaxmlJaBcz2z?tsn1h(mw0`HL{ET zvGz7HZ*6!fyMAqW{dpB;a_7AV8b%kkd&BU=*6QeoPKAR@);8BR zhQXk>xyk|R^*07I+lHeT-x|I$B1;Z@puc)y zuud7lnQ$YIkPKPGe{6x|@AkTK&+t-qPcS@sVS8=jqoB`YhTHw>XROZPvfgH}A6E}E%c=OhE-To&1lP2~axUh|By~#9oI;H0Zn_K?Y z(=<{prALDw2rsXcKRjFc=kK5LvebSk|37{peAza8o=j(KF_mF z;-^oCmu(Q@t@H_HZr%z<51kI*{^DSBg;Fy9ZSo1YCHq%TcMf0C8U6n0@XjC@U3pvh z>7DP~7Tz7amP%zsl9NjI!uA2i!)}F#3<*?b$Gdb1GCX#HoE>b8e&Y72=BT$=pW#WC4;CM8M}MD-jUI( z?hH?p8-DE0@E-d1tvkb41c!Du?h2m?s-M1a^w;kV&(goooD0w3M_)S^o;qF^eE;Af z(ult{zO&L@iGm;FY$Qd3W8EXe%cW8&gvYvElcde<=fhDbX#H2`!^`Pk1k?Sy!(XK- zqp#f^UU}`o{+hHB3=VJ5uN?t&Y-ioHoESf@YXIt+avdcm$GMm zMZR}Oe|S&$f?FtDlQ}>%g2>*0%T;Pi;H*-TacmeI+7RsF>}wdole#x&cXZpm;cG`H?+w>?e)`_< zT+of)x%0n16#hlGd*B^AfBKQ|_qx4j51knO$^+qLm7~7?KzM!c+2F*^3;u4n5d{B! zG>U1)@Mt&q^61LHAO3Oo$3L^P`47T(tp=T)vk!&e z=yrQIjjn$jm`1|C#YS<4=T_tatlcqaS@N97NxH{OaTP9KYwTyO{{#%s>M z@%4AV;oR}ppMUT9bJt#X&$Z`XclABjU3>ieRrlX_?y3*I|GnoveBa$y-T%S&pS%02 zdp~^swfEis^a~GnPSGa+wOefp`Hvd%GY$DqNIueuIvq^-hWub6f3qR~_lEpu4f)#* zd4-f3&==Nck7$`%q|Pg8e>dPf|3Jx)Hsq%o^1mbbIyL_P(7)fT2!tmj|ckiUmyz218p@;~pA|Mh^hG2rE-%s?r01N~cj=r2ju z9tcT6th3Y=&t@Xdw-Kit^x@y3RK){q~H8XJD4As;1K zD|mI|`9ErG`1!^L|F$82t06~&#s;@FHuz*i{;h`m(S}EUxgo!!q2NEZa@2VdEvPNL zsj;6IbBE&M{``I{RG{dL2D2OA0; zr1=B-f=9m2>(l=32mh?G;9D9C{HMkSA8b7T5Ur)FfI4?mhHQ*}{s$xvw1xLJCS1!K hjE+7Q-ZA=<$3lXs(RUvUZ$GwZ%eM32$PzgL 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

iO9t&U7$@eb(k?@Lc=eg0f zKN|kmZuaH9i~d%4`=L%}@1e)TZ*;reTSqrN5q?kC!S~T8!t0z-&pZ)+xYzmk=){M@ z>)+USp$j*|VAyeg4dgF}hqYk%@t=A&*z5(t=63L=f4?{R&Ho(#`A2@gA?Cl6Z6G{+)*WTtog{Cm(g=aQ`Sg2hr4mZ@VA7!F|D^OPsq{esx2Bs3CvS$v4pWUu?+#u_5=I!EbQu z*9%@OKOp&4PUZ<8Y{;Kz$e(Y>SGl=%Xug}>_w2Dhb#mkiQ>{SgG-L&Swjn>$u;6O9 zAm9J}4F!(5xmkg?HWc_hx4w(PRDt(27W_nmL;eA`AS?J24f(Q$0&i(7@JkJazuu6e zcQ*$7vxfY48Vdc3hP>NQ=$#GuR~rldA1g<}-)=0p*O328W5KK;A8jmnO+!BJ?%#1= zNb7sdc<28o%@2a$mmBhPPG*oEZY=QPhI~^)zS50n1+L}!CH}wOSl~NO=9vF+Y=J|G>%Ykqc--neQhX@>d!PynU)* zq~!B&8#nw(L;kzd0eb(38VbFhTUzqh(x^Z)xA z13uf3?{6sZfrk8aL;h_iGe$nwxc-Jxp(+3W--ZQ`H5Axz6YRJz#PGKo3;ctIg*PI_?l}@TzBom4?gs+GY>p?{r8T(l7>e| Z|LrOF*SDVvPaR)&;NFjZCj8lB{|~7&3vmDd