From 88d595a7bf64d19bb54af81a6fce7b1f03706b69 Mon Sep 17 00:00:00 2001 From: Balhau Date: Wed, 8 Jan 2025 16:02:19 +0000 Subject: [PATCH] On php ffi and performance examples --- php/Dockerfile | 5 +++++ php/Makefile | 28 ++++++++++++++++++++++++++++ php/heavy_stuff.c | 24 ++++++++++++++++++++++++ php/heavy_stuff.php | 24 ++++++++++++++++++++++++ php/heavy_stuff.so | Bin 0 -> 15704 bytes php/heavy_stuff_c.php | 13 +++++++++++++ php/heavy_stuff_opt_c.php | 13 +++++++++++++ php/lesser_heavy.php | 16 ++++++++++++++++ php/main | Bin 0 -> 16784 bytes php/main.c | 12 ++++++++++++ 10 files changed, 135 insertions(+) create mode 100644 php/Dockerfile create mode 100644 php/Makefile create mode 100644 php/heavy_stuff.c create mode 100644 php/heavy_stuff.php create mode 100755 php/heavy_stuff.so create mode 100644 php/heavy_stuff_c.php create mode 100644 php/heavy_stuff_opt_c.php create mode 100644 php/lesser_heavy.php create mode 100755 php/main create mode 100644 php/main.c diff --git a/php/Dockerfile b/php/Dockerfile new file mode 100644 index 0000000..9dce732 --- /dev/null +++ b/php/Dockerfile @@ -0,0 +1,5 @@ +FROM php:8.2-alpine + +RUN apk add --no-cache --virtual .persistent-deps libffi-dev \ + && docker-php-ext-configure ffi --with-ffi \ + && docker-php-ext-install ffi diff --git a/php/Makefile b/php/Makefile new file mode 100644 index 0000000..046078b --- /dev/null +++ b/php/Makefile @@ -0,0 +1,28 @@ +DOCKER_RUN=docker run -it --rm -v "$PWD:/usr/src/myapp" -w /usr/src/myapp php/ffi +CC=gcc + +.PHONY: all +all: docker-image build-native-lib build-main-c + +.PHONY: build-native-lib +build-native-lib: + ${CC} -shared -o heavy_stuff.so -fPIC heavy_stuff.c + +build-main-c: + ${CC} main.c ./heavy_stuff.so -o main + +.PHONY: docker-image +docker-image: + docker build -t php/ffi . + +.PHONY: run-heavy-php +run-heavy-php: + ${DOCKER_RUN} php heavy_stuff.php + +.PHONY: run-heavy-php-c +run-heavy-php-c: + ${DOCKER_RUN} php heavy_stuff. + +.PHONY: clean +clean: + rm main heavy_stuff.so diff --git a/php/heavy_stuff.c b/php/heavy_stuff.c new file mode 100644 index 0000000..79c5543 --- /dev/null +++ b/php/heavy_stuff.c @@ -0,0 +1,24 @@ +unsigned long some_heavy_stuff(int lima, int limb) { + unsigned long result = 0; + int i, j = 0; + int sum = 0; + for (i = 0; i < lima; i++) { + sum = 0; + for (j = 0; j < limb; j++) { + sum += i + j; + } + result += sum; + } + return result; +} + +unsigned long lesser_heavy_stuff(int lima, int limb) { + unsigned long result = 0; + int i, j = 0; + for (i = 0; i < lima; i++) { + // Optimize sum of first n numbers + // Factorize outer index + result += (i * limb) + ((limb - 1) * limb) / 2; + } + return result; +} diff --git a/php/heavy_stuff.php b/php/heavy_stuff.php new file mode 100644 index 0000000..53e9b08 --- /dev/null +++ b/php/heavy_stuff.php @@ -0,0 +1,24 @@ + diff --git a/php/heavy_stuff.so b/php/heavy_stuff.so new file mode 100755 index 0000000000000000000000000000000000000000..6f5276c4712e2a522ba5f60315df3c5324061393 GIT binary patch literal 15704 zcmeHOZ)hCH6@RO<9NDsUijxq$ChYJ8a#BY$g0R7Z#~*(Oy6PV zU|9Zw+dIcncrEBgytB+Z%RG_C*k5FuA6E5|`gx85#K@FF>)nPZ?+WvxatHH7s$3v; z;(agsMcO;Yyl5Upe~{Y~DeXOtJj%;|T4b1yb9-xz!wlzBB&#Z)6ocl>k)y+a>A66C zNpJ_KemCo6U-zxO(|^9!e)5@5e{Yr+{_@-X18@J5Tq&&-gW{_Gx4~JO(P}Ot_Q{s% zpT2iwRo^d<^j|un}^1Vg<{0d;!BK3BSdOEHMs_GhQea zor;$!dyWInlS6|})-Ai^6BW-b4-NL^OGS4mGm>|GTfD^?J(Y3BCW@K-#Iy^QQo(g{ zZsxmF7`Hk$26?wqamyiy+n4J|=I;vk?+jljg1^FeSK22EF8cLDK2BpoxskFI!1m&7N<)u^Yht z(FL!iwrI~@YP+aXQ+wpE2>+w@)xV)gZU^#5?PaAMM#2j{?-K8Y*0)GJw(8x3p?*en z47H(lJ-K~`0$pT@{=ZTFkNk?nuG{w9ioNjnL-xXI!ZzNpuip0V#sGsHpsjX&EV&)q z5k9p))8nEUst*j?vprj>YR|pzZL;Tk`cYXrS*z8SviR{vYY*ziv&aqcZ#<7i3N(zo zx$j+@tG;7jwpOW|m#r0F-1NmVi4XQ&wpdrz50dl4%k$QXv1nK~XHjDPfc4Jl8}rsp z`$gNZR%fkc1eXt3*G^xu=dIOeFE*N6o~tf3nhV93Sh%s> zxN>#XSd`e@;PUCkMr<{P^--f<>!LHDGoUk|GoUk|GoUk|GoUk|GoUk|GoUlj$bhje zae&@k(z~+MO08z2>_$0>@)pW7D03gxYUfZ=p?9oQjOpWGoa!{TZMviFEWWVYf!LSu zZ}G!gO}*;t=0Rdpwpk*;>gfD& zOW)@8Eo0b%Z$FLjd9;&X!+t{93DQMpKxaT_KxaT_KxaT_KxaT_KxaT_Kxg28Hv_U? zRQ88%lCG+UNPx|(U*i3+_pvVfPPeg+kBF*lWhwhl>A8}M*gwAQKVGizW>VSrdx1BR zsy)Hz-^Kby#RiyS+0L?yWqt2y+6V4nJWUVOSft%^z6u*y3jY>A?$+b5{l6t-AA7Vt z*_V5yukZ2H&f$@2(W|B&GxwR@5ACTcZO`}jcAMS%%)PsOJQ|@{PvFj8*$*GICU94_ z>~jy}36OCL# zr-F!IPvC6tj>S7b=6jHpfF#H~596H>H?9e|6J(!t*nbOcfp01axC>++1dR#&FHS1f z|DK?ms?%QXb?{LwYM|@91^2V3Bl+xLd@_Q6nQ{4@ka%<~#R&9=+M`1I^o^MO6cDF& zS0eH0`Zl0B&o3e#*Z;M?*RNHa&2S}!l}L$;^9S@Xa1utx>otYn)s*Kq8IO+3+laS7 z^L)OBI6(7!`%w8e&(Dt$H}IrEbUw7>7mhoZa6jYGa|yctC>?mH;JJuw$r;a=MlyLP>y^qCCsREIqou-R-u2w9xxf3-J@HO- z4r0Q|l*^eZ$1Qs0DHtnf@IXYiS}05*C7?Oz>4jVarzWsxj?;ghC{c4LL)- zPYhU2+~JI-0~}8HfQLFI5`Plp^UjZikD7p4nJRdh5tLrpmpQ2wOP*_v7pvxExismP zy(uv3&`5P6pM7W|3(6svspP=SP8BhjFTFCDWjCK85KNU3b29Il<0TJF&pm~oG(upy zIUb8#7Ad0n6n{{BPpMKCeHXbDQ`U3! z`#k^d%eoO=RFOEM`@g>pzN`mCMs6R`@bDZ43brrn29f`cPZKf7PcuQ}4i+l;W$pBy0NoVN7!XkdY*3boi1r0QJq$?%el2V_I58;b^6-_}tq}jLImom>8t$!ckzmA3=U)Bp<%oo2XU-TV^Jh+h$YP|Dm1x*p?zIi7I$qH!1g$@h`G&~ujbJ;*=5&(~(9 WAvQ)-Tq(!%4?OAsome_heavy_stuff(1000,1000); + +echo "The heavy result: $result\n"; + +?> diff --git a/php/heavy_stuff_opt_c.php b/php/heavy_stuff_opt_c.php new file mode 100644 index 0000000..43423d1 --- /dev/null +++ b/php/heavy_stuff_opt_c.php @@ -0,0 +1,13 @@ +lesser_heavy_stuff(1000,1000); + +echo "The heavy result: $result\n"; + +?> diff --git a/php/lesser_heavy.php b/php/lesser_heavy.php new file mode 100644 index 0000000..6ee283b --- /dev/null +++ b/php/lesser_heavy.php @@ -0,0 +1,16 @@ + diff --git a/php/main b/php/main new file mode 100755 index 0000000000000000000000000000000000000000..4eea68c4c907c5bd645344afcdf2eb46a6803ccd GIT binary patch literal 16784 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 F{{Su!sjC10 literal 0 HcmV?d00001 diff --git a/php/main.c b/php/main.c new file mode 100644 index 0000000..4b2c21e --- /dev/null +++ b/php/main.c @@ -0,0 +1,12 @@ +#include + +extern unsigned long some_heavy_stuff(int lima, int limb); + +int main(void) { + int lima = 1000; + int limb = 1000; + printf("Hello from blistering C: \n"); + printf("Doing stuff: \n"); + unsigned long result = some_heavy_stuff(lima, limb); + printf("Result is %lu", result); +}