this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Create list benchmarks

authored by

David Mo and committed by
Louis Pilfold
3db41fd9 46a52677

+183
+4
Makefile
··· 51 51 export-hex-tarball-test: ## Run `gleam export hex-tarball` and verify it is created 52 52 cd test/hextarball && make test 53 53 54 + .PHONY: benchmark 55 + benchmark: ## Run the benchmarks 56 + cd benchmark/list && make 57 + 54 58 # Debug print vars with `make print-VAR_NAME` 55 59 print-%: ; @echo $*=$($*)
+4
benchmark/list/.gitignore
··· 1 + *.beam 2 + *.ez 3 + /build 4 + erl_crash.dump
+26
benchmark/list/Makefile
··· 1 + .PHONY: build 2 + build: clean erlang nodejs deno bun 3 + 4 + .PHONY: clean 5 + clean: 6 + rm -rf build 7 + 8 + .PHONY: erlang 9 + erlang: 10 + @echo test/language on Erlang 11 + cargo run --quiet -- test --target erlang 12 + 13 + .PHONY: nodejs 14 + nodejs: 15 + @echo test/language on JavaScript with Node 16 + cargo run --quiet -- test --target javascript --runtime nodejs 17 + 18 + .PHONY: deno 19 + deno: 20 + @echo test/language on JavaScript with Deno 21 + cargo run --quiet -- test --target javascript --runtime deno 22 + 23 + .PHONY: bun 24 + bun: 25 + @echo test/language on JavaScript with Bun 26 + cargo run --quiet -- test --target javascript --runtime bun
+8
benchmark/list/gleam.toml
··· 1 + name = "list" 2 + version = "1.0.0" 3 + description = "Benchmarks for lists" 4 + licenses = ["Apache-2.0"] 5 + 6 + [dependencies] 7 + gleam_stdlib = "~> 0.28" 8 + gleamy_bench = ">= 0.6.0 and < 1.0.0"
+11
benchmark/list/manifest.toml
··· 1 + # This file was generated by Gleam 2 + # You typically do not need to edit this file 3 + 4 + packages = [ 5 + { name = "gleam_stdlib", version = "0.59.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "F8FEE9B35797301994B81AF75508CF87C328FE1585558B0FFD188DC2B32EAA95" }, 6 + { name = "gleamy_bench", version = "0.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleamy_bench", source = "hex", outer_checksum = "DEF68E4B097A56781282F0F9D48371A0ABBCDDCF89CAD05B28C3BEDD6B2E8DF3" }, 7 + ] 8 + 9 + [requirements] 10 + gleam_stdlib = { version = "~> 0.28" } 11 + gleamy_bench = { version = ">= 0.6.0 and < 1.0.0" }
+3
benchmark/list/src/list.gleam
··· 1 + pub fn main() { 2 + Nil 3 + }
+13
benchmark/list/test/benchmarks.gleam
··· 1 + import gleamy/bench 2 + 3 + import gleam/io 4 + import gleam/list 5 + 6 + pub fn print_results(results: List(bench.BenchResults)) { 7 + results 8 + |> list.map(fn(result) { 9 + result 10 + |> bench.table([bench.IPS, bench.Min, bench.P(99)]) 11 + |> io.println() 12 + }) 13 + }
+114
benchmark/list/test/list_test.gleam
··· 1 + import benchmarks.{print_results} 2 + import gleam/list 3 + import gleamy/bench 4 + 5 + pub fn main() { 6 + print_results([bench_odd_nums_between(), bench_count_ones(), bench_slice()]) 7 + } 8 + 9 + fn bench_odd_nums_between() -> bench.BenchResults { 10 + let odd_nums_between = fn(args) { 11 + let #(start, end) = args 12 + odd_nums_between(start, end, []) 13 + } 14 + 15 + bench.run( 16 + [ 17 + bench.Input("[0, 100)", #(0, 100)), 18 + bench.Input("[0, 1000)", #(0, 1000)), 19 + bench.Input("[0, 10_000)", #(0, 10_000)), 20 + bench.Input("[0, 100_000)", #(0, 100_000)), 21 + bench.Input("[0, 1_000_000)", #(0, 1_000_000)), 22 + ], 23 + [bench.Function("odd_nums_between", odd_nums_between)], 24 + [bench.Duration(1000), bench.Warmup(100)], 25 + ) 26 + } 27 + 28 + /// Returns a list of numbers from `start` up to, but not including, `end`. 29 + fn odd_nums_between(start: Int, end: Int, acc: List(Int)) -> List(Int) { 30 + case start { 31 + start if start >= end -> list.reverse(acc) 32 + _ -> { 33 + let acc = case start { 34 + n if n % 2 == 1 -> [n, ..acc] 35 + _ -> acc 36 + } 37 + odd_nums_between(start + 1, end, acc) 38 + } 39 + } 40 + } 41 + 42 + fn bench_count_ones() -> bench.BenchResults { 43 + let create_list = fn(size) { 44 + list.range(0, size) 45 + |> list.map(fn(n) { 46 + case n { 47 + _ if n % 3 == 0 -> 1 48 + _ -> 0 49 + } 50 + }) 51 + } 52 + 53 + let count_ones = fn(list) { count_ones(list, 0) } 54 + 55 + bench.run( 56 + [ 57 + bench.Input("100 numbers", create_list(100)), 58 + bench.Input("1000 numbers", create_list(1000)), 59 + bench.Input("10_000 numbers", create_list(10_000)), 60 + bench.Input("100_000 numbers", create_list(100_000)), 61 + bench.Input("1_000_000 numbers", create_list(1_000_000)), 62 + ], 63 + [bench.Function("count_ones", count_ones)], 64 + [bench.Duration(1000), bench.Warmup(100)], 65 + ) 66 + } 67 + 68 + /// Counts the number of ones in a list. 69 + fn count_ones(list: List(Int), count: Int) -> Int { 70 + case list { 71 + [] -> count 72 + [1, ..tail] -> count_ones(tail, count + 1) 73 + [_, ..tail] -> count_ones(tail, count) 74 + } 75 + } 76 + 77 + fn bench_slice() -> bench.BenchResults { 78 + let list = list.range(0, 1_000_000) 79 + 80 + let slice = fn(args) { 81 + let #(list, start, end) = args 82 + slice(list, start, end, []) 83 + } 84 + 85 + bench.run( 86 + [ 87 + bench.Input("[0, 1000)", #(list, 0, 1000)), 88 + bench.Input("[0, 10_000)", #(list, 0, 10_000)), 89 + bench.Input("[0, 100_000)", #(list, 0, 100_000)), 90 + bench.Input("[999_000, 1_000_000)", #(list, 999_000, 1_000_000)), 91 + bench.Input("[990_000, 1_000_000)", #(list, 990_000, 1_000_000)), 92 + bench.Input("[900_000, 1_000_000)", #(list, 900_000, 1_000_000)), 93 + bench.Input("[0, 1_000_000)", #(list, 0, 1_000_000)), 94 + ], 95 + [bench.Function("slice", slice)], 96 + [bench.Duration(1000), bench.Warmup(100)], 97 + ) 98 + } 99 + 100 + /// Slices a list. 101 + fn slice(list: List(Int), start: Int, end: Int, acc: List(Int)) -> List(Int) { 102 + case list { 103 + // If the first element is before the slice, skip it. 104 + [_, ..tail] if start > 0 -> { 105 + slice(tail, start - 1, end - 1, acc) 106 + } 107 + // If the first element is within the slice, add it to the accumulator. 108 + [head, ..tail] if end > 0 -> { 109 + slice(tail, start - 1, end - 1, [head, ..acc]) 110 + } 111 + // Otherwise, return the accumulator. 112 + _ -> list.reverse(acc) 113 + } 114 + }