diff --git a/README.md b/README.md index da2cf9b..c0e45f5 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Lower values are better. | Implementation | 10k | 100k | 1M | | -------------- | --: | ---: | ----: | | dotnet | 22M | 38M | 190M | -| elixir | 95M | 446M | 3854M | +| elixir | 88M | 343M | 3080M | | go | 29M | 261M | 2571M | | java | 93M | 170M | 1001M | | nodejs | 26M | 107M | 666M | diff --git a/elixir/main.exs b/elixir/main.exs new file mode 100644 index 0000000..36c73d2 --- /dev/null +++ b/elixir/main.exs @@ -0,0 +1,28 @@ +# Use processes directly @josevalim + +defmodule Main do + def start() do + num_tasks = + case System.argv() |> List.first() |> Integer.parse() do + {num, _} -> num + _ -> 10000 + end + + tasks = + for _ <- 1..num_tasks do + spawn_monitor(fn -> + :timer.sleep(10000) + end) + end + + for {_pid, ref} <- tasks do + receive do + {:DOWN, ^ref, _, _, _} -> :ok + end + end + + IO.puts("All tasks completed") + end +end + +Main.start() diff --git a/elixir/tasks.ex b/elixir/tasks.exs similarity index 79% rename from elixir/tasks.ex rename to elixir/tasks.exs index 9438d56..9f99b6d 100644 --- a/elixir/tasks.ex +++ b/elixir/tasks.exs @@ -1,3 +1,6 @@ +# Tasks are a higher-level abstraction and they will include additional features +# for tracking responses. + defmodule Tasks do use Task diff --git a/results.md b/results.md index 3426561..3613446 100644 --- a/results.md +++ b/results.md @@ -23,7 +23,7 @@ Lower values are better. | Implementation | 10k | 100k | 1M | | -------------- | --: | ---: | ----: | | dotnet | 22M | 38M | 190M | -| elixir | 95M | 446M | 3854M | +| elixir | 88M | 343M | 3080M | | go | 29M | 261M | 2571M | | java | 93M | 170M | 1001M | | nodejs | 26M | 107M | 666M | diff --git a/run.sh b/run.sh index e79e144..65aee88 100755 --- a/run.sh +++ b/run.sh @@ -8,98 +8,98 @@ set +x parallel=${2:-10000} status () { - local opts - if [ $(uname) = "Darwin" ]; then - opts="-l 15" - else - opts="-b -n15" - fi - top $opts -pid $1 -stats pid,cpu,mem | egrep "$1" + local opts + if [ $(uname) = "Darwin" ]; then + opts="-l 15" + else + opts="-b -n15" + fi + top $opts -pid $1 -stats pid,cpu,mem | egrep "$1" } _dotnet () { - cd dotnet - dotnet publish -c Release --self-contained true - exec ./bin/Release/net9.0/osx-arm64/publish/dotnet $parallel & - status $! + cd dotnet + dotnet publish -c Release --self-contained true + exec ./bin/Release/net9.0/osx-arm64/publish/dotnet $parallel & + status $! } _elixir () { - cd elixir - exec elixir tasks.ex $parallel & - status $! + cd elixir + exec elixir main.exs $parallel & + status $! } _go () { - cd go - go build - exec ./coroutines $parallel & - status $! + cd go + go build + exec ./coroutines $parallel & + status $! } _java () { - cd java - exec java VirtualThreads.java $parallel & - status $! + cd java + exec java VirtualThreads.java $parallel & + status $! } _nodejs () { - cd nodejs - exec node main.js $parallel & - status $! + cd nodejs + exec node main.js $parallel & + status $! } _bun () { - cd nodejs - exec bun run main.js $parallel & - status $! + cd nodejs + exec bun run main.js $parallel & + status $! } _deno () { - cd nodejs - exec deno run main.js $parallel & - status $! + cd nodejs + exec deno run main.js $parallel & + status $! } _python () { - cd python - exec python3 main.py $parallel & - status $! + cd python + exec python3 main.py $parallel & + status $! } _rust_async_std () { - cd rust_async_std - cargo build -r - exec ./target/release/rust_async_std $parallel & - local pid=$! - status $pid + cd rust_async_std + cargo build -r + exec ./target/release/rust_async_std $parallel & + local pid=$! + status $pid } _rust_futures () { - cd rust_futures - cargo build -r - exec ./target/release/rust_futures $parallel & - local pid=$! - status $pid + cd rust_futures + cargo build -r + exec ./target/release/rust_futures $parallel & + local pid=$! + status $pid } _rust_tokio () { - cd rust_tokio - cargo build -r - exec ./target/release/rust_tokio $parallel & - local pid=$! - status $pid + cd rust_tokio + cargo build -r + exec ./target/release/rust_tokio $parallel & + local pid=$! + status $pid } _all () { - for cmd in dotnet elixir go java nodejs bun deno python rust_async_std rust_futures rust_tokio; do - echo === $cmd === - ./run.sh $cmd $parallel - done + for cmd in dotnet elixir go java nodejs bun deno python rust_async_std rust_futures rust_tokio; do + echo === $cmd === + ./run.sh $cmd $parallel + done } _versions () { - cat << EOS + cat << EOS - dotnet: $(dotnet --version) - elixir: $(elixir --version | tail -1) - go: $(go version) @@ -112,6 +112,10 @@ _versions () { EOS } +_docs () { + markedpp -s -i README.md +} + # ... ignition ... function help {