From 39f3ea56211d4b6904290dd2f257715c901c25bf Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Tue, 5 Aug 2025 10:37:58 +0200 Subject: Add benchmarks for Ruby, Python and Clojure Ruby is about the same speed as slets. Clojure (babashka) and Python are goddamn fast. Python is 10 times as fast. Clojure is twice as slow as Python but that still outperforms Ruby and slsets. --- benchmarks/benchmark.clj | 11 +++++++++++ benchmarks/benchmark.py | 10 ++++++++++ benchmarks/benchmark.rb | 8 ++++++++ 3 files changed, 29 insertions(+) create mode 100644 benchmarks/benchmark.clj create mode 100644 benchmarks/benchmark.py create mode 100644 benchmarks/benchmark.rb diff --git a/benchmarks/benchmark.clj b/benchmarks/benchmark.clj new file mode 100644 index 0000000..96ca968 --- /dev/null +++ b/benchmarks/benchmark.clj @@ -0,0 +1,11 @@ +;; Run as e.g. "bb benchmark.clj 1000" +(ns benchmark + (:require [clojure.set :as set])) + +(def size (Integer/parseInt (first *command-line-args*))) + +(def set1 (set (map (fn [i] (keyword (str "x" i))) (range size)))) +(def set2 (set (map (fn [i] (keyword (str "y" i))) (range size)))) + +(doseq [x (range 10000)] + (set/difference set1 set2)) diff --git a/benchmarks/benchmark.py b/benchmarks/benchmark.py new file mode 100644 index 0000000..eae0e7c --- /dev/null +++ b/benchmarks/benchmark.py @@ -0,0 +1,10 @@ +import sys + +size = int(sys.argv[1]) + +myset1 = {f"x{i*1000}" for i in range(0, size)} +myset2 = {f"x{i*1000+1}" for i in range(0, size)} + +res = None +for i in range(0, 10000): + res = myset1 - myset2 diff --git a/benchmarks/benchmark.rb b/benchmarks/benchmark.rb new file mode 100644 index 0000000..275b7e2 --- /dev/null +++ b/benchmarks/benchmark.rb @@ -0,0 +1,8 @@ +size = ARGV[0].to_i # NOTE: ARGV[0] is _not_ the program/script name.... + +myset1 = Set.new((0..size).map {|i| "x#{i*1000}"} ) +myset2 = Set.new((0..size).map {|i| "x#{i*1000+1}"} ) + +(0..10000).each do + res = myset1 - myset2 +end -- cgit v1.2.3