From dcab2a8875dbceac02c1f09c32f0f810f4ad6915 Mon Sep 17 00:00:00 2001 From: samsonium Date: Thu, 29 Oct 2026 05:21:31 +0300 Subject: [PATCH] feat: add runtime speed comparison between fz, c and cpython --- Makefile | 36 +++++++++++++++++++++++++++++++----- benchmarks/loop-c | Bin 0 -> 15560 bytes benchmarks/loop.fzs | 5 +++-- benchmarks/loop.py | 4 ++++ 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100755 benchmarks/loop-c create mode 100644 benchmarks/loop.py diff --git a/Makefile b/Makefile index ae2f996..8744b71 100644 --- a/Makefile +++ b/Makefile @@ -5,13 +5,15 @@ RUNS ?= 7 WARMUP ?= 2 MAX_ITER ?= 2000000 +current_time = python3 -c "import time; print(time.time())" + build: cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug cmake --build build build-release: - cmake -S . -B build -DCMAKE_BUILD_TYPE=Release - cmake --build build + cmake -S . -B build -DCMAKE_BUILD_TYPE=Release $(COMPARING) + cmake --build build $(COMPARING) debug-c: build gdb --args ./build/fzc ${FILE} @@ -22,8 +24,32 @@ debug-vm: build test: build ctest --output-on-failure --test-dir build -# Compile the benchmark once, then measure only VM process execution. +test-release: build-release + ctest --output-on-failure --test-dir build + +bench: COMPARING=&>/dev/null bench: build-release - ./build/fzc -o build/benchmark.fzb $(BENCH_FILE) - python3 scripts/benchmark.py --runs $(RUNS) --warmup $(WARMUP) \ + @./build/fzc -o build/benchmark.fzb $(BENCH_FILE) + @python3 scripts/benchmark.py --runs $(RUNS) --warmup $(WARMUP) \ --max-iter $(MAX_ITER) --vm ./build/fz --program build/benchmark.fzb + +compare: COMPARING=&>/dev/null +compare: build-release + @echo "=== Million sums benchmark ===" + + @./build/fzc -o build/bench.fzb $(BENCH_FILE) 1>/dev/null 2>/dev/null + + @ST=$$($(current_time)); \ + ./build/fz --allow-infinite build/bench.fzb 1>/dev/null 2>/dev/null; \ + ET=$$($(current_time)); \ + python3 -c "delta = ($$ET - $$ST) * 1000; print(f'FZLang : {delta:.5f} ms')" + + @ST=$$($(current_time)); \ + ./benchmarks/loop-c 1>/dev/null 2>/dev/null; \ + ET=$$($(current_time)); \ + python3 -c "delta = ($$ET - $$ST) * 1000; print(f'C : {delta:.5f} ms')" + + @ST=$$($(current_time)); \ + python3 ./benchmarks/loop.py 1>/dev/null 2>/dev/null; \ + ET=$$($(current_time)); \ + python3 -c "delta = ($$ET - $$ST) * 1000; print(f'CPython: {delta:.5f} ms')" diff --git a/benchmarks/loop-c b/benchmarks/loop-c new file mode 100755 index 0000000000000000000000000000000000000000..1d9bee5f623b6ecb88af51d01136b1269e13ab0f GIT binary patch literal 15560 zcmeHOZERa-6@KlctJj9uEiG$PXw1}BY$$H*d?+0Xb-r)9v<+PbMWVZNVkfb1?8v^} z(jiz-7$S5PVS=$g+p5tYWkMnnAY~H*mrWIu5LzoC82qUQMX5Ro{%2E>om%(KL<*l!dfRVUwi{43i=E4D6oNOyz>x>l4>mo!@An%Q4_&W~eeuWpo_g_#6Py3A zKa(D9Z{43sHf7S;;!M*_M|)FyYow5i#1s#^krp1$nfI5e=ja$OrhYZWxLymBVe1;k zlcZyt-Z;)${@*5jSa&A*gS4#Wf0p!NTJ#np#ofA+Wz$R-a$~U;vtZ?|Trra&&2&DU zwZ_e{$fiFB4UV>1bJJe^Hs(vPJSn>l6eYG7!vyT^=0Vv)8=za`RI z?RQkWt;!r6Icz3V`P4+ZV5RaShkG))Y-%Jinn_WJiK$#xf|`!&nvTlePB@40dBsOt zzKan1Pq86=C!cZd7oD|}|5BIUg^{`2hMe zq7TGvnt~qkZx1?p-j{e=qg{6CWmmRM%Pu{RAvUbI^zP&7hD*=;E!rtBH+rPZ`Ax-}D zDw*Ri#k+%QuIzifKl)nq(m9{?p_h16UWlBNNvpjoYt-Q!nI#k$HMwV|2#N<@gZaW zO=IqlE5jpw(Ngp^<8)_&Xyxrcj41VXl|%YBNMoGdaEal-4Qo54?rH8*>h3IG4mQqG zRP~A=`G3#$Z+n5^o}0$}igErg2aWSLY7E~60RrXAPTs)h{LXf=SrtG2 zpfT6k&0S;uidAQv>g*?BdH!a(yqu)DUf9q{vhM_OEAg3s^-(esi~IJru54XWddNW-z=y9C&{Oq6##j+RC8!#g#0XT3!W^TUK_JE+6+ zWdA%Xjrx%P=%)HW*JhUN_p)(9UN?R(OYgi&wbaMEDgUe^^FImPe9C9rA^SC%xjZkn z^LX6!cWk!O`|&d1Wx&gTmjN#WUIx4jcp30A;AOzez-?v#b%3b*!}Cd(j8}(o<)P^V zBEKbdf;&Y*VQ8(BiGU^Obe+~OTZkBWGvLFvmsNtL82O?^y4O|jCKUZ@5sRPP+ z8dHj&*SKwWpz@37u|=s9L~Ww|tVmw`{KpNohIculIxc~se?}&Td6&eGiZJbl_`5}h z-@nSv`cYnO6}?-v*VmBo=uN6EBk%NhYs>9oe^+FzhYbH;1Jr@*12)U{jtlDcTgj*w z9q8$~FZ{8ARMyJn!qIjrs*Re{vF2EN^MP1Mo_Pr?dNRQK*?r-yOh)|(6ZJz3#1RJ zohlTkj;no#`dj@$h2ssTXQ{*f`uH!BJ`5)pzC`^k{+$Zj1*QwE=YJl;jz$hU^=lGC zszL3DJ9_+nmpWVNYYigVZJ!u^N67yA{QpFH_MesgC@=okY`q9BsHF|e^VG))kv{D5 zL-$_N-wnZqeWc&&r?Z8=|7LQz>ByKedp~=m>+oO?)o9b-EoPr#_8;py+-DlS$CNoR zbhNu`$UNHL|3Ke}InvcV)JN6ZdIfnLh2kx@ssh(4)2qY|Wu}q|E1|d!Jxw84aO%b1 zQ#@`a3psN#kxg=8`QTCVN~W`Bv5-pAAX)k`M+*hvN`ZT|{=FKK3fWDQs?^QCBfaMP z)ugYkkFN~CRq-ZGmi{!06i!ZAiBUo-xwml=y==}(MJBSv$Y?Q5-zB7zDnh0Bsr3a@W@!Wmt-ND-B$Y3ubJB35dK zL_4FAe9q2qBsFP{=Mz&Yb23SzK~j;*M5pt)=~Ui2DXOmS!6qv);RG=g`Fw&bJS6%w zm&8<>qB-MJ?p0(gH#J3PI@fM^+g-kn^0f!otM$IWK>!@Lkh!Xd4uJ}Pz3-vm&%W-~ zPQp8M?LmB8pMiXyGK~ZEni!~$MqD5(*ouXKi~=C^R*f>uGc^wpPN2^N2^qZIy^S`xPJha#1ZlJ^?yY8 z-QtJ)5n!{6&pFfiv!vsk$ZbsZJSZ!U`!sT~8|DG|3)FG*!@>h1KK#X8Io*C$;}44i z5dQ1&zoGFT76LE~q9DctKBMtx#Q;oeI}CUj_BoA@>n{-Z!SL7fcUJh={wgeZ84aR~Lx8b2O(EWmSc6vX}m^{dozpMTc-jt~Ai|2G(zp9%?I z_vcvdwngHLd&LBPtfFx`;JXp~uG`g+0gsFEBV^<}V?H?l^K%vE?&hD7!1p7N7&Xzp RJza}`t;HcUXar4E{{iXm*{J{k literal 0 HcmV?d00001 diff --git a/benchmarks/loop.fzs b/benchmarks/loop.fzs index 9a76b7a..78c03e2 100644 --- a/benchmarks/loop.fzs +++ b/benchmarks/loop.fzs @@ -3,6 +3,7 @@ uint i = 0; uint sum = 0; for (i = 0; i < 1000000; i = i + 1) -{ sum = sum + i; -} + +printline(sum); + diff --git a/benchmarks/loop.py b/benchmarks/loop.py new file mode 100644 index 0000000..be130e9 --- /dev/null +++ b/benchmarks/loop.py @@ -0,0 +1,4 @@ +s = 0 +for i in range(1_000_000): + s += i +print(s)