From 5fb1f0cb1782634288cbb67c4660025d11c0804a Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Thu, 16 Apr 2026 13:01:32 -0400 Subject: [PATCH] Add benchmark dot diagrams showing performance differences MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 5 new diagrams (Graphviz DOT → PNG): benchmark-ack.dot — ack(3,4) across all 5 tiers benchmark-sumto.dot — sum-to(50k) across all 5 tiers benchmark-fib.dot — fib(35) iterative across all 5 tiers benchmark-speedup.dot — JIT speedup ratios (7x-784x) benchmark-binary-size.dot — 13KB asm vs 171KB C vs ~30MB Python JIT: 0.19ms ack, 7x faster than CPython, 784x faster than Python VM. Makefile docs target now auto-discovers all docs/*.dot files. --- Makefile | 5 ++++- docs/benchmark-ack.dot | 19 +++++++++++++++++++ docs/benchmark-ack.png | Bin 0 -> 18285 bytes docs/benchmark-binary-size.dot | 17 +++++++++++++++++ docs/benchmark-binary-size.png | Bin 0 -> 20252 bytes docs/benchmark-fib.dot | 19 +++++++++++++++++++ docs/benchmark-fib.png | Bin 0 -> 18366 bytes docs/benchmark-speedup.dot | 25 +++++++++++++++++++++++++ docs/benchmark-speedup.png | Bin 0 -> 45355 bytes docs/benchmark-sumto.dot | 19 +++++++++++++++++++ docs/benchmark-sumto.png | Bin 0 -> 18444 bytes 11 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 docs/benchmark-ack.dot create mode 100644 docs/benchmark-ack.png create mode 100644 docs/benchmark-binary-size.dot create mode 100644 docs/benchmark-binary-size.png create mode 100644 docs/benchmark-fib.dot create mode 100644 docs/benchmark-fib.png create mode 100644 docs/benchmark-speedup.dot create mode 100644 docs/benchmark-speedup.png create mode 100644 docs/benchmark-sumto.dot create mode 100644 docs/benchmark-sumto.png diff --git a/Makefile b/Makefile index c48acf7..520384f 100644 --- a/Makefile +++ b/Makefile @@ -116,7 +116,10 @@ friction: c-build asm-build # ─── Documentation ──────────────────────────────────────────────── -docs: docs/python-architecture.png docs/c-architecture.png docs/asm-architecture.png docs/jit-pipeline.png +DOT_FILES := $(wildcard docs/*.dot) +DOT_PNGS := $(DOT_FILES:.dot=.png) + +docs: $(DOT_PNGS) docs/%.png: docs/%.dot dot -Tpng $< -o $@ diff --git a/docs/benchmark-ack.dot b/docs/benchmark-ack.dot new file mode 100644 index 0000000..5b85406 --- /dev/null +++ b/docs/benchmark-ack.dot @@ -0,0 +1,19 @@ +// ack(3,4) benchmark — all implementations +// "A diagram is worth 10,000 words." — russell@unturf.com +digraph benchmark_ack { + rankdir=LR + node [shape=record, style=filled, fontname="Helvetica", fontsize=11] + edge [style=invis] + label="ack(3,4) — time in milliseconds (lower is better)" + labelloc=t + fontsize=14 + fontname="Helvetica Bold" + + jit [label="{C + JIT|0.19 ms}" fillcolor="#00b894" fontcolor=white width=0.5] + cpython [label="{CPython|1.3 ms}" fillcolor="#0984e3" fontcolor=white width=1.5] + asm [label="{Assembly|8 ms}" fillcolor="#6c5ce7" fontcolor=white width=3.0] + cinterp [label="{C interpreter|20 ms}" fillcolor="#fdcb6e" width=5.0] + pyvm [label="{Python VM|149 ms}" fillcolor="#e17055" fontcolor=white width=10.0] + + jit -> cpython -> asm -> cinterp -> pyvm +} diff --git a/docs/benchmark-ack.png b/docs/benchmark-ack.png new file mode 100644 index 0000000000000000000000000000000000000000..c38b5a816042d9fd93f21ce401c79f82d025b355 GIT binary patch literal 18285 zcmdVCWmFvP)&)pNf&_Q>V8K0j0)*fsA-FpPcWodcL4vz9lHl%cjk`NE(73xb&J_3F z_xskmGxKBC%%7<&py+fxUG?iE;Rs?VesW;D_k7Va6DyLD9?Yc|r-stWz2ltX-m`1j>_E(}KX{JEqM zs>J!3CnXh+`JpJ>Yk0vcAn7*MNg=?HIOxAOUg}LJ3cvq;RmO&S=Y!OLZKUM%&Htx2 z`e$Yl;r!QTX&-w|``;Tzc(mSs4Jeh>_IW(yzlY>~E9d!N1L8y>eU#<+?-9qBnf@Q2 zq~I2*fNf}>$!a?qN0F;`M2}<}5T)6m_xP`u%y4UUTwPp}KM9ocBgY z07i!i_gIc1*oin5a>m7w_qL=V_Fn65jq34OS0Bu8Q;;CU(vah83DSWbFq{ z#Kp}_UGtax{?~-abY%TAv6i3oeD7VRi!?hrgYkA|%jpo*bsS!T1?(88sr_*1q(@so zUI^30+C6+TIx1@o=^mRTEsqagYQ3f$ykg3Ys zLGJlQy)LuNN7B~U*RT44@syx7HnOs^f`Mb#!c@jT8oFFsYV!XUY$rctTcT_!n6Am0 zZn(I#gcbff662gNQ}z)46Vq?~8;&RE6Uxu+M?~QWWtI~RYNdJ@t>-%v^*{zcBNnhF zhxy#H$tSRH9IteA_VlQ0!b@};-8YlWQ7|#PZEF*}9+te0HXx7p922?9TW*kBing}4 zi@7RKF01JxCkhF{En|gGwROWY{CrXbx)Ts7A@euW*xjoC&J{t(|77fNP{)eFaEhRb zxj7IY%jqH#kA+jMMYng1zZj!fYtH z3%LBCu&|Ai#zVyA>#g+Mva-mkD&FpJiUIRIv2FhH$<;=8uZUfKX=Ahr2nPiq@(quqfr|$o=Vl&&gAt zUAra}C>*D)R5vwZCr}DcT=|?et45h0n|94;=0~iX^Bu`gpFY(e6ns+wQqaf8Cwom% zaksdnbU495_2217$|?Epove7Z5*rAAzAGy$-5;qy>(F7_S~4t=V?RTF@O@24 zcsT!(#})<5707iY1BFD+Hcs>oCT3Q52ihZEG zmgAju8}ZuS5dyXg8ih6LSrt|d8Db@t+NJfIq|Z4K5fMXISB*M2(bvFsEhjd@7NgYq zsWbY%&CiH|+LQ+7FHAoj4>VV6r*9146OzGedV1CQ;f53*0zob_OcL%+f$7w%Qtet> zXZRx`tioQ6MeNJxM;e)<#{6%}Pj9N;@10vyfWeE#J*XM1~l z=*B<-8PM@;YoS3v#1Ymel*NmATlPvJOEQXzdmlCKAYN31MVdkuKbRBi~mrxK_%f+;IHvqI49eF}KFFAoeF_y2wNJmZG zdc@!Yq|I2iJQ1V<4;2IW*ce7-egryB&e6K_!@3T*P>sb{JCJAjyh{bqdV^+_ zhUFTel%k%*<>loq#*FmzB$N@k<4;k&NIiF?l^yt2P5LwpgL0ZR0GPKWF`(PasR9lw z&x5AZewLO4Ts*umdG`8F3usMosr7i4toh_ogxF1<{xtvq7==?>hQ8BP2f2m2$t8Ia zR`b&UDD|lG+bxMaMYOz!@=X3%kV`sMCYhASOrcm0h-6Yq%0AicH}JV*&b=8iW6vPo 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 c -> py +} diff --git a/docs/benchmark-binary-size.png b/docs/benchmark-binary-size.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3a5ba9e45b1769c29b4f96cc27226c76e1f3d8 GIT binary patch literal 20252 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 cinterp -> jit -> asm -> pyvm +} diff --git a/docs/benchmark-fib.png b/docs/benchmark-fib.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca3949479484df0ac84a7d60ac8b732e62ae909 GIT binary patch literal 18366 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 cpython [label=" 7x faster " color="#00b894" fontcolor="#00b894"] + jit -> asm [label=" 42x faster " color="#6c5ce7" fontcolor="#6c5ce7"] + jit -> cinterp [label=" 105x faster " color="#fdcb6e" fontcolor="#b8860b"] + jit -> pyvm [label=" 784x faster " color="#e17055" fontcolor="#e17055"] + + {rank=same; cpython; asm; cinterp; pyvm} +} diff --git a/docs/benchmark-speedup.png b/docs/benchmark-speedup.png new file mode 100644 index 0000000000000000000000000000000000000000..c742c5cd2cdbf53f660a866545ff441b8ded4ffe GIT binary patch literal 45355 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�%L0}FtL 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%0A-Ih)zkYx0|H5r92EFq-Nleu)5qZQ~Q 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 P00000NkvXXu0mjf?XIFr literal 0 HcmV?d00001 diff --git a/docs/benchmark-sumto.dot b/docs/benchmark-sumto.dot new file mode 100644 index 0000000..2225b84 --- /dev/null +++ b/docs/benchmark-sumto.dot @@ -0,0 +1,19 @@ +// sum-to(50000) benchmark — all implementations +// "A diagram is worth 10,000 words." — russell@unturf.com +digraph benchmark_sumto { + rankdir=LR + node [shape=record, style=filled, fontname="Helvetica", fontsize=11] + edge [style=invis] + label="sum-to(50000) — time in milliseconds (lower is better)" + labelloc=t + fontsize=14 + fontname="Helvetica Bold" + + jit [label="{C + JIT|0.55 ms}" fillcolor="#00b894" fontcolor=white width=0.5] + cpython [label="{CPython|5.5 ms}" fillcolor="#0984e3" fontcolor=white width=1.5] + asm [label="{Assembly|43 ms}" fillcolor="#6c5ce7" fontcolor=white width=3.5] + cinterp [label="{C interpreter|109 ms}" fillcolor="#fdcb6e" width=6.0] + pyvm [label="{Python VM|437 ms}" fillcolor="#e17055" fontcolor=white width=10.0] + + jit -> cpython -> asm -> cinterp -> pyvm +} diff --git a/docs/benchmark-sumto.png b/docs/benchmark-sumto.png new file mode 100644 index 0000000000000000000000000000000000000000..1f36edcc5260d6dba5f1191d48e96e8b57149dac GIT binary patch literal 18444 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 QJ6}Lzp00i_>zopr0OVzLuK)l5 literal 0 HcmV?d00001