Isolate benchmarks in separate processes

Each benchmark now runs in its own forked process to prevent memory/garbage collection state from one test contaminating results of others, providing more stable and reliable performance measurements. Also fixed benchmark result comparison to match by name instead of array index, handling cases where different branches have different benchmark lists.