// fiber_pure_test.wren - Test pure Fiber performance without I/O foreign class Host { foreign static signalDone() } var mainFiber = Fiber.new { System.print("=== Pure Fiber Performance Test ===\n") // Test 1: Minimal yield overhead System.print("Test 1: Minimal Fiber.yield() cost") var iterations = 100000 var start = System.clock for (i in 1..iterations) { Fiber.yield() } var elapsed = System.clock - start System.print(" %(iterations) yields: %(elapsed)s") System.print(" Rate: %(iterations/elapsed) yields/sec") System.print(" Per yield: %(elapsed/iterations * 1000000) microseconds\n") // Test 2: Fiber creation cost System.print("Test 2: Fiber creation overhead") iterations = 10000 start = System.clock for (i in 1..iterations) { var f = Fiber.new { } } elapsed = System.clock - start System.print(" %(iterations) fiber creations: %(elapsed)s") System.print(" Rate: %(iterations/elapsed) fibers/sec") System.print(" Per fiber: %(elapsed/iterations * 1000) milliseconds\n") // Test 3: Fiber with work System.print("Test 3: Fiber with actual work") var counter = 0 var workFiber = Fiber.new { for (i in 1..10000) { counter = counter + 1 if (i % 100 == 0) Fiber.yield() } } start = System.clock while (!workFiber.isDone) { workFiber.call() } elapsed = System.clock - start System.print(" Processed %(counter) items in %(elapsed)s") System.print(" Rate: %(counter/elapsed) items/sec\n") // Test 4: Multiple fibers cooperating System.print("Test 4: Multiple fibers round-robin") var fibers = [] var shared = 0 for (i in 1..100) { fibers.add(Fiber.new { for (j in 1..100) { shared = shared + 1 Fiber.yield() } }) } start = System.clock var done = false while (!done) { done = true for (f in fibers) { if (!f.isDone) { f.call() done = false } } } elapsed = System.clock - start System.print(" 100 fibers x 100 yields = %(shared) operations in %(elapsed)s") System.print(" Rate: %(shared/elapsed) ops/sec\n") // Test 5: Producer-consumer pattern System.print("Test 5: Producer-Consumer pattern") var queue = [] var produced = 0 var consumed = 0 var producer = Fiber.new { for (i in 1..1000) { queue.add(i) produced = produced + 1 if (queue.count > 10) Fiber.yield() } } var consumer = Fiber.new { while (consumed < 1000) { if (queue.count > 0) { var item = queue.removeAt(0) consumed = consumed + 1 } else { Fiber.yield() } } } start = System.clock while (!producer.isDone || !consumer.isDone) { if (!producer.isDone) producer.call() if (!consumer.isDone) consumer.call() } elapsed = System.clock - start System.print(" Produced: %(produced), Consumed: %(consumed)") System.print(" Time: %(elapsed)s") System.print(" Rate: %(consumed/elapsed) items/sec\n") // Test 6: Deep call stack System.print("Test 6: Deep recursion with yields") var depth = 0 var maxDepth = 1000 var recursiveFiber = Fiber.new { for (i in 1..maxDepth) { depth = depth + 1 Fiber.yield() } } start = System.clock while (!recursiveFiber.isDone) { recursiveFiber.call() } elapsed = System.clock - start System.print(" Processed %(depth) yields: %(elapsed)s") System.print(" Per yield: %(elapsed/depth * 1000000) microseconds\n") System.print("=== Analysis ===") System.print("Based on these results, Wren fibers are:") var yieldMicros = elapsed/iterations * 1000000 if (yieldMicros < 1) { System.print(" EXCELLENT - Sub-microsecond yields") } else if (yieldMicros < 10) { System.print(" GOOD - Single-digit microsecond yields") } else if (yieldMicros < 50) { System.print(" MODERATE - Tens of microseconds per yield") } else { System.print(" SLOW - Over 50 microseconds per yield") System.print(" This suggests FFI overhead or implementation issues") } Host.signalDone() while(true) { Fiber.yield() } }