git.delta.rocks / jrsonnet / refs/commits / d96a379e8bd8

difftreelog

chore add benchmark results

Лач2020-07-20parent: #14f17a7.patch.diff
in: master

3 files changed

modified.gitignorediffbeforeafterboth
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,5 @@
 cache
 
 jsonnet-cpp
+jsonnet-sjsonnet
+benchmarks
modifiedMakefilediffbeforeafterboth
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,13 @@
 .PHONY: test build build-wasi
 jsonnet-cpp:
 	git clone https://github.com/google/jsonnet jsonnet-cpp
+.ONESHELL:
+jsonnet-sjsonnet:
+	mkdir jsonnet-sjsonnet && cd jsonnet-sjsonnet
+	wget https://github.com/databricks/sjsonnet/releases/download/0.2.4/sjsonnet.jar
+	echo "#!/bin/sh" > sjsonnet
+	echo "java -Xss400m -jar $(PWD)/jsonnet-sjsonnet/sjsonnet.jar $@" >> sjsonnet
+	chmod +x sjsonnet
 
 .ONESHELL:
 test-examples: jsonnet-cpp
@@ -21,3 +28,51 @@
 	RUSTFLAGS="-Zmutable-noalias=yes -C link-arg=-s" cargo build --release -p jrsonnet
 build-wasi:
 	cd ./bindings/ && cargo build --release -p jsonnet --target wasm32-wasi
+
+bench = hyperfine --export-markdown "result.$(1).md" "jrsonnet $(1)" "gojsonnet $(1)" "jsonnet $(1)" "sjsonnet $(1)"
+bench-larger-stack = hyperfine --export-markdown "result.$(1).md" "jrsonnet $(1)" "gojsonnet -s 200000 $(1)" "jsonnet -s 200000 $(1)" "sjsonnet $(1)"
+bench-no-scala = hyperfine --export-markdown "result.$(1).md" "jrsonnet $(1)" "gojsonnet $(1)" "jsonnet $(1)"
+bench-no-go = hyperfine --export-markdown "result.$(1).md" "jrsonnet $(1)" "jsonnet $(1)" "sjsonnet $(1)"
+
+.PHONY: benchmarks
+.ONESHELL:
+benchmarks: jsonnet-cpp jsonnet-sjsonnet
+	export PATH=$(PWD)/target/release/:$(PWD)/jsonnet-sjsonnet/:$(PATH)
+
+	mkdir -p $(PWD)/benchmarks
+
+	cd jsonnet-cpp/benchmarks/
+
+	jrsonnet -S gen_big_object.jsonnet > bench.05.gen.jsonnet
+
+	$(call bench,bench.01.jsonnet)
+	$(call bench,bench.02.jsonnet)
+	$(call bench,bench.03.jsonnet)
+	$(call bench,bench.04.jsonnet)
+	$(call bench,bench.05.gen.jsonnet)
+	# std.reverse not implemented in sjsonnet
+	$(call bench-no-scala,bench.06.jsonnet)
+	$(call bench-larger-stack,bench.07.jsonnet)
+	$(call bench,bench.08.jsonnet)
+
+	rm -f result.md
+	find . | /usr/bin/grep -oE "[a-z_0-9.]+.jsonnet$$" | grep -v gen_big_object | xargs -n1 -i sh -c 'printf "## {}\n\n" >> result.md && cat result.{}.md >> result.md && printf "\n" >> result.md'
+	cp result.md $(PWD)/benchmarks/benchmarks.md
+
+	cd ../perf_tests/
+
+	$(call bench,large_string_join.jsonnet)
+	golang overflows os stack on this benchmark
+	$(call bench-no-go,large_string_template.jsonnet)
+	$(call bench,realistic1.jsonnet)
+	$(call bench,realistic2.jsonnet)
+
+	rm -f result.md
+	find . | /usr/bin/grep -oE "[a-z_0-9.]+.jsonnet$$" | xargs -n1 -i sh -c 'printf "## {}\n\n" >> result.md && cat result.{}.md >> result.md && printf "\n" >> result.md'
+	cp result.md $(PWD)/benchmarks/perf_tests.md
+
+	cd $(PWD)/benchmarks/
+
+	rm -f result.md
+	printf "# Benchmark results\n\n" > result.md
+	cat benchmarks.md perf_tests.md >> result.md
modifiedREADME.mddiffbeforeafterboth
after · README.md
1# jrsonnet23## What is it45[Jsonnet](https://jsonnet.org/) is a json templating language67This crate implements both jsonnet library, and alternative jsonnet executable89## Why1011There is already 3 implementations of this standard: in [C++](https://github.com/google/jsonnet), in [Go](https://github.com/google/go-jsonnet/) and in [Scala](https://github.com/databricks/sjsonnet)1213It is fun to write one in Rust :D1415## Spec support1617- Can pass all of original `examples` tests18- Can pass all of original `test_suite` tests, expect those, which checks golden output for stacktraces (vanilla-like stacktraces are implemented, but look is not 100% identical): ![Example output](./traces.png)1920## Bindings2122Jrsonnet implements standard `libjsonnet.so` shared library, and should work as drop-in replacement for it2324WASM bindings are also available, Java bindings (Both JNI and WASM to .class compiled) are in progress2526See `./bindings/`2728## Benchmark2930This is fastest implementation of jsonnet, according to both official benchmarks31and mine cluster configuration templating speed3233Official benchmark report are available [in this gist](https://gist.github.com/CertainLach/5770d7ad4836066f8e0bd91e823e451b), and updated sometimes. Here it tested against golang, C++, and scala impl. As you can see, it is a lot faster3435You can generate this report by calling `make benchmarks`, but it probally won't work in standard setup, you need to link golang jsonnet impl to gojsonnet, and c++ impl to jsonnet.3637TODO: Create docker container for easier benchmarking and/or benchmark in CI3839Also, there is some ideas to improve performance even further, by i.e:4041- Mutating strings/arrays/objects instead of cloning on some operations (I.e concat), it should be possible by checking strong reference count, and mutating if there is only one reference