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 0000000..6f5276c Binary files /dev/null and b/php/heavy_stuff.so differ diff --git a/php/heavy_stuff_c.php b/php/heavy_stuff_c.php new file mode 100644 index 0000000..7b05df9 --- /dev/null +++ b/php/heavy_stuff_c.php @@ -0,0 +1,13 @@ +some_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 0000000..4eea68c Binary files /dev/null and b/php/main differ 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); +}