summaryrefslogtreecommitdiff
path: root/benchmark/fiber_chain.rb
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/fiber_chain.rb')
-rwxr-xr-xbenchmark/fiber_chain.rb40
1 files changed, 40 insertions, 0 deletions
diff --git a/benchmark/fiber_chain.rb b/benchmark/fiber_chain.rb
new file mode 100755
index 0000000000..7e0a7f9d45
--- /dev/null
+++ b/benchmark/fiber_chain.rb
@@ -0,0 +1,40 @@
+# Check performance of fiber creation and transfer.
+
+def make_link(previous)
+ Fiber.new do
+ while message = previous.resume
+ Fiber.yield(message)
+ end
+ end
+end
+
+def make_chain(length, &block)
+ chain = Fiber.new(&block)
+
+ (length - 1).times do
+ chain = make_link(chain)
+ end
+
+ return chain
+end
+
+def run_benchmark(length, repeats, message = :hello)
+ chain = nil
+
+ chain = make_chain(length) do
+ while true
+ Fiber.yield(message)
+ end
+ end
+
+ repeats.times do
+ abort "invalid result" unless chain.resume == message
+ end
+end
+
+n = (ARGV[0] || 1000).to_i
+m = (ARGV[1] || 1000).to_i
+
+5.times do
+ run_benchmark(n, m)
+end