Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Immediately surface fatal errors in IO.raiseError #3811

Merged
merged 8 commits into from
Nov 23, 2023

Conversation

scott-thomson239
Copy link
Contributor

Resolves #3767

From my understanding, the problem was that manually raising fatal errors through 'raiseError' was not treated the same as a fatal error thrown inside a delay within IOFiber. This PR just adds a check in the Error case to call onFatalFailure if a raised error is a fatal error.

Sorry this has taken so long. I was struggling to figure out how to test a fatal error is thrown without it crashing the test until I discovered unsafeRun exists.

@armanbilge armanbilge linked an issue Sep 6, 2023 that may be closed by this pull request
Copy link
Member

@armanbilge armanbilge left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice job, looks good! Just had an idea for the test.

Comment on lines 350 to 361
import scala.util.control.NonFatal
val io = IO.raiseError[Unit](new VirtualMachineError {}).voidError

val fatalThrown =
try {
unsafeRun[Unit](io)
false
} catch {
case t if NonFatal(t) => false
case _: Throwable => true
}
IO(fatalThrown) must completeAs(true)
Copy link
Member

@armanbilge armanbilge Sep 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
import scala.util.control.NonFatal
val io = IO.raiseError[Unit](new VirtualMachineError {}).voidError
val fatalThrown =
try {
unsafeRun[Unit](io)
false
} catch {
case t if NonFatal(t) => false
case _: Throwable => true
}
IO(fatalThrown) must completeAs(true)
val error = new VirtualMachineError {}
val io = IO.raiseError[Unit](error).voidError
val fatalThrown =
try {
unsafeRun[Unit](io)
false
} catch {
case t: Throwable => t eq error
}
IO.pure(fatalThrown) must completeAs(true)

Comment on lines 244 to 247
if (!NonFatal(cur.t))
onFatalFailure(cur.t)

runLoop(failed(cur.t, 0), nextCancelation, nextAutoCede)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (!NonFatal(cur.t))
onFatalFailure(cur.t)
runLoop(failed(cur.t, 0), nextCancelation, nextAutoCede)
val ex = cur.t
if (!NonFatal(ex))
onFatalFailure(ex)
runLoop(failed(ex, 0), nextCancelation, nextAutoCede)

@armanbilge
Copy link
Member

CI seems to be hanging, and it looks legit. Not sure what's going on exactly ...

@armanbilge
Copy link
Member

I played with this a bit last night. The fix and test seem good but somehow the test runner just hangs. I don't really understand what's happening, I assume the fatal exception is escaping somehow and killing a thread. Maybe it's a specs2 thing, not sure ...

@durban
Copy link
Contributor

durban commented Sep 7, 2023

Wait, doesn't onFatalFailure shuts down the whole runtime? It would make sense that might make a test hang...

@armanbilge
Copy link
Member

armanbilge commented Sep 7, 2023

Oh LOL good point. We should make a new runtime for this?

On the other hand, I'm pretty sure onFatalFailure shuts down all runtimes. Hmm. But I thought we have some other tests for fatal errors, and those seemed to work. Note entirely sure actually, maybe I'm confusing with tests for unhandled errors.

@armanbilge
Copy link
Member

Haha yup, that would be it.

val runtimes = IORuntime.allRuntimes.unsafeHashtable()
val length = runtimes.length
while (r < length) {
val ref = runtimes(r)
if (ref.isInstanceOf[IORuntime]) {
val rt = ref.asInstanceOf[IORuntime]

Ok, so we need to rewrite this as an IOApp test.

Those live here: https://github.com/typelevel/cats-effect/blob/1bbe7f619125302131b0d6c94a67ad05aa31e33a/tests/shared/src/main/scala/catseffect/examples.scala

Then we can add the test to IOAppSpec.

@diogocanut
Copy link
Contributor

just out of curiosity, how did you debug it to discover where the error was?

@armanbilge
Copy link
Member

@diogocanut who are you addressing? I'm not sure if anyone "debugged" it per se. Daniel Urban reminded me that fatal errors shutdown the runtime, and so I just checked the implementation of onFatalFailure.

@diogocanut
Copy link
Contributor

I mean @scott-thomson239 . I tried looking at this but didn't went through the point of going to IOFiber.runLoop.

@scott-thomson239
Copy link
Contributor Author

@diogocanut I happened to watch this talk by Daniel Spiewak which gives a very nice overview of IOFiber and gave me a rough idea where to look first. After that I just compared the differences between how IO.raiseError and IO(...) were handled to find out why IO(throw new VirtualMachineError {}).voidError works as expected and raiseError doesn't and noticed that anytime a fatal error could be encountered in the Delay branch of the run loop, it was being handled using onFatalFailure

@scott-thomson239
Copy link
Contributor Author

It seems there were a couple of other places in runLoop where an Error needs to be handled. I've added handling in the Attempt branch since without it, it will swallow fatal errors.

There are two other cases in the FlatMap branch and Map branch but I didn't add fatal error handling here since I can't see any scenario where a fatal error could be encountered here without it having been handled earlier.

@durban
Copy link
Contributor

durban commented Sep 14, 2023

@scott-thomson239 I've started CI, and it seems it failed with scalafmt. (Next time feel free to comment if CI is not approved in a timely manner.)

@armanbilge
Copy link
Member

armanbilge commented Sep 17, 2023

Looks like some legitimate failures on Node.js.

[error]   x exit on raising a fatal error with attempt
[error]    /home/runner/work/cats-effect/cats-effect/tests/js/target/scala-2.12/cats-effect-tests-fastopt.js:36149
[error]      throw $ct_ju_NoSuchElementException__T__(new $c_ju_NoSuchElementException(), "None.get")
[error]      ^
[error]    
[error]    <ref *1> java.util.NoSuchElementException: None.get
[error]        at $c_s_None$.get__E (https://raw.githubusercontent.com/scala/scala/v2.12.17/src/library/scala/Option.scala:529:19)
[error]        at $c_s_None$.get__O (https://raw.githubusercontent.com/scala/scala/v2.12.17/src/library/scala/Option.scala:527:13)
[error]        at $c_Lcatseffect_examples_JSRunner$.main__AT__V (/home/runner/work/cats-effect/cats-effect/tests/js/src/main/scala/catseffect/examplesplatform.scala:73:10)
[error]        at $s_Lcatseffect_examples_JSRunner__main__AT__V (/home/runner/work/cats-effect/cats-effect/tests/js/src/main/scala/catseffect/examplesplatform.scala:35:10)
[error]        at Object.<anonymous> (/home/runner/work/cats-effect/cats-effect/tests/js/target/scala-2.12/cats-effect-tests-fastopt.js:64091:1)
[error]        at Object.<anonymous> (/home/runner/work/cats-effect/cats-effect/tests/js/target/scala-2.12/cats-effect-tests-fastopt.js:64092:4)
[error]        at Module._compile (node:internal/modules/cjs/loader:1256:14)
[error]        at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
[error]        at Module.load (node:internal/modules/cjs/loader:1119:32)
[error]        at Module._load (node:internal/modules/cjs/loader:960:12) {
[error]      jl_Throwable__f_s: 'None.get',
[error]      jl_Throwable__f_e: null,
[error]      jl_Throwable__f_writableStackTrace: true,
[error]      jl_Throwable__f_jsErrorForStackTrace: [Circular *1],
[error]      jl_Throwable__f_stackTrace: null
[error]    }
[error]    
[error]    Node.js v18.17.1 doesn't contain 'Boom!' (IOAppSpec.scala:193)
[error]   x exit on raising a fatal error with handleError
[error]    /home/runner/work/cats-effect/cats-effect/tests/js/target/scala-2.12/cats-effect-tests-fastopt.js:36149
[error]      throw $ct_ju_NoSuchElementException__T__(new $c_ju_NoSuchElementException(), "None.get")
[error]      ^
[error]    
[error]    <ref *1> java.util.NoSuchElementException: None.get
[error]        at $c_s_None$.get__E (https://raw.githubusercontent.com/scala/scala/v2.12.17/src/library/scala/Option.scala:529:19)
[error]        at $c_s_None$.get__O (https://raw.githubusercontent.com/scala/scala/v2.12.17/src/library/scala/Option.scala:527:13)
[error]        at $c_Lcatseffect_examples_JSRunner$.main__AT__V (/home/runner/work/cats-effect/cats-effect/tests/js/src/main/scala/catseffect/examplesplatform.scala:73:10)
[error]        at $s_Lcatseffect_examples_JSRunner__main__AT__V (/home/runner/work/cats-effect/cats-effect/tests/js/src/main/scala/catseffect/examplesplatform.scala:35:10)
[error]        at Object.<anonymous> (/home/runner/work/cats-effect/cats-effect/tests/js/target/scala-2.12/cats-effect-tests-fastopt.js:64091:1)
[error]        at Object.<anonymous> (/home/runner/work/cats-effect/cats-effect/tests/js/target/scala-2.12/cats-effect-tests-fastopt.js:64092:4)
[error]        at Module._compile (node:internal/modules/cjs/loader:1256:14)
[error]        at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
[error]        at Module.load (node:internal/modules/cjs/loader:1119:32)
[error]        at Module._load (node:internal/modules/cjs/loader:960:12) {
[error]      jl_Throwable__f_s: 'None.get',
[error]      jl_Throwable__f_e: null,
[error]      jl_Throwable__f_writableStackTrace: true,
[error]      jl_Throwable__f_jsErrorForStackTrace: [Circular *1],
[error]      jl_Throwable__f_stackTrace: null
[error]    }
[error]    
[error]    Node.js v18.17.1 doesn't contain 'Boom!' (IOAppSpec.scala:200)

@armanbilge
Copy link
Member

The new example IOApps need to be registered here for JS, and also similarly for Native.

register(HelloWorld)
register(Arguments)
register(NonFatalError)
register(FatalError)
registerRaw(FatalErrorRaw)
register(Canceled)
registerLazy("catseffect.examples.GlobalRacingInit", GlobalRacingInit)
registerLazy("catseffect.examples.GlobalShutdown", GlobalShutdown)
register(ShutdownHookImmediateTimeout)
register(LiveFiberSnapshot)
register(FatalErrorUnsafeRun)
register(Finalizers)
register(LeakedFiber)
register(UndefinedProcessExit)
register(CustomRuntime)
register(CpuStarvation)

@scott-thomson239
Copy link
Contributor Author

I've registered the new IOApps for JS, although I'm not sure how I would do that for native. the tests/native/src/main/scala/catseffect/examplesplatform.scala file seems empty and does not mention any of the existing IOApps.

@armanbilge
Copy link
Member

armanbilge commented Sep 19, 2023

although I'm not sure how I would do that for native

Ah, I'm sorry, we haven't enabled those tests yet on this branch. We'll have to fix that when we merge into series/3.x.

Copy link
Member

@armanbilge armanbilge left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there are two more places we need to handle this.

case 1 =>
val error = ioe.asInstanceOf[Error]
runLoop(failed(error.t, 0), nextCancelation - 1, nextAutoCede)

case 1 =>
val error = ioe.asInstanceOf[Error]
runLoop(failed(error.t, 0), nextCancelation - 1, nextAutoCede)

Copy link
Member

@armanbilge armanbilge left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice job with this, esp. catching the subtlety of the different branches. This ended up being quite tricky!

Comment on lines 448 to +450
val t = error.t
if (!NonFatal(t))
onFatalFailure(t)
Copy link
Member

@armanbilge armanbilge Sep 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Woops, looks like the convention was val t = error.t and not val ex = error.t. Not a big deal :)

Copy link
Member

@djspiewak djspiewak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Implementation looks good but I'd like to see some comprehensive benchmarks first. I'll try to do that soon.

JamesWelshKaluza
JamesWelshKaluza approved these changes Sep 29, 2023
@djspiewak
Copy link
Member

Before

[info] Benchmark                                                              (count)  (cpuTokens)  (fibers)  (iterations)   (size)  (threads)   Mode  Cnt      Score      Error    Units
[info] AsyncBenchmark.async                                                       N/A          N/A       N/A           N/A      100        N/A  thrpt   10  30161.846 ±  386.746    ops/s
[info] AsyncBenchmark.bracket                                                     N/A          N/A       N/A           N/A      100        N/A  thrpt   10  21232.799 ± 1128.194    ops/s
[info] AsyncBenchmark.cancelable                                                  N/A          N/A       N/A           N/A      100        N/A  thrpt   10  26025.778 ±  347.659    ops/s
[info] AsyncBenchmark.race                                                        N/A          N/A       N/A           N/A      100        N/A  thrpt   10  10737.953 ±   78.325    ops/s
[info] AsyncBenchmark.racePair                                                    N/A          N/A       N/A           N/A      100        N/A  thrpt   10  40513.017 ±  549.119    ops/s
[info] AsyncBenchmark.start                                                       N/A          N/A       N/A           N/A      100        N/A  thrpt   10  12342.961 ±  200.805    ops/s
[info] AsyncBenchmark.uncancelable                                                N/A          N/A       N/A           N/A      100        N/A  thrpt   10  30946.441 ±  564.440    ops/s
[info] AtomicCellBenchmark.cancellationAsync                                      N/A          N/A        10          1000      N/A        N/A  thrpt   10     38.627 ±    1.455    ops/s
[info] AtomicCellBenchmark.cancellationAsync                                      N/A          N/A        50          1000      N/A        N/A  thrpt   10     18.259 ±    0.049    ops/s
[info] AtomicCellBenchmark.cancellationAsync                                      N/A          N/A       100          1000      N/A        N/A  thrpt   10     11.481 ±    0.040    ops/s
[info] AtomicCellBenchmark.cancellationConcurrent                                 N/A          N/A        10          1000      N/A        N/A  thrpt   10     38.300 ±    0.082    ops/s
[info] AtomicCellBenchmark.cancellationConcurrent                                 N/A          N/A        50          1000      N/A        N/A  thrpt   10     17.780 ±    0.064    ops/s
[info] AtomicCellBenchmark.cancellationConcurrent                                 N/A          N/A       100          1000      N/A        N/A  thrpt   10     11.442 ±    0.031    ops/s
[info] AtomicCellBenchmark.happyPathAsync                                         N/A          N/A        10          1000      N/A        N/A  thrpt   10    265.592 ±    0.523    ops/s
[info] AtomicCellBenchmark.happyPathAsync                                         N/A          N/A        50          1000      N/A        N/A  thrpt   10     54.692 ±    0.125    ops/s
[info] AtomicCellBenchmark.happyPathAsync                                         N/A          N/A       100          1000      N/A        N/A  thrpt   10     27.880 ±    0.596    ops/s
[info] AtomicCellBenchmark.happyPathConcurrent                                    N/A          N/A        10          1000      N/A        N/A  thrpt   10    248.621 ±    0.300    ops/s
[info] AtomicCellBenchmark.happyPathConcurrent                                    N/A          N/A        50          1000      N/A        N/A  thrpt   10     52.349 ±    0.389    ops/s
[info] AtomicCellBenchmark.happyPathConcurrent                                    N/A          N/A       100          1000      N/A        N/A  thrpt   10     25.729 ±    0.663    ops/s
[info] AtomicCellBenchmark.highContentionAsync                                    N/A          N/A        10          1000      N/A        N/A  thrpt   10     53.009 ±    1.227    ops/s
[info] AtomicCellBenchmark.highContentionAsync                                    N/A          N/A        50          1000      N/A        N/A  thrpt   10      9.991 ±    0.287    ops/s
[info] AtomicCellBenchmark.highContentionAsync                                    N/A          N/A       100          1000      N/A        N/A  thrpt   10      5.273 ±    0.154    ops/s
[info] AtomicCellBenchmark.highContentionConcurrent                               N/A          N/A        10          1000      N/A        N/A  thrpt   10     52.535 ±    0.646    ops/s
[info] AtomicCellBenchmark.highContentionConcurrent                               N/A          N/A        50          1000      N/A        N/A  thrpt   10     10.083 ±    0.094    ops/s
[info] AtomicCellBenchmark.highContentionConcurrent                               N/A          N/A       100          1000      N/A        N/A  thrpt   10      4.856 ±    0.125    ops/s
[info] AttemptBenchmark.errorRaised                                               N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3852.690 ±   12.620    ops/s
[info] AttemptBenchmark.happyPath                                                 N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   5177.415 ±   14.832    ops/s
[info] BlockingBenchmark.blockThenCede                                            N/A          N/A       N/A           N/A    10000        N/A  thrpt   10      6.930 ±    0.084    ops/s
[info] BlockingBenchmark.coarse                                                   N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   7604.795 ±   24.750    ops/s
[info] BlockingBenchmark.fine                                                     N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   1090.826 ±    4.384    ops/s
[info] BlockingBenchmark.nested                                                   N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   1051.903 ±    5.170    ops/s
[info] BothBenchmark.happyPath                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    134.966 ±    1.100    ops/s
[info] DeepBindBenchmark.async                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   2501.605 ±    9.173    ops/s
[info] DeepBindBenchmark.delay                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   9381.930 ±   41.239    ops/s
[info] DeepBindBenchmark.pure                                                     N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  10966.261 ±   95.453    ops/s
[info] DeferredBenchmark.cancel                                                    10          N/A       N/A           N/A      N/A        N/A  thrpt   10    101.831 ±    3.513    ops/s
[info] DeferredBenchmark.cancel                                                   100          N/A       N/A           N/A      N/A        N/A  thrpt   10     13.970 ±    0.130    ops/s
[info] DeferredBenchmark.cancel                                                  1000          N/A       N/A           N/A      N/A        N/A  thrpt   10      1.192 ±    0.037    ops/s
[info] DeferredBenchmark.complete                                                  10          N/A       N/A           N/A      N/A        N/A  thrpt   10    104.768 ±    0.277    ops/s
[info] DeferredBenchmark.complete                                                 100          N/A       N/A           N/A      N/A        N/A  thrpt   10     23.810 ±    0.139    ops/s
[info] DeferredBenchmark.complete                                                1000          N/A       N/A           N/A      N/A        N/A  thrpt   10      4.859 ±    0.060    ops/s
[info] DeferredBenchmark.getAfter                                                  10          N/A       N/A           N/A      N/A        N/A  thrpt   10   6971.103 ±   10.047    ops/s
[info] DeferredBenchmark.getAfter                                                 100          N/A       N/A           N/A      N/A        N/A  thrpt   10   2005.327 ±    6.266    ops/s
[info] DeferredBenchmark.getAfter                                                1000          N/A       N/A           N/A      N/A        N/A  thrpt   10    243.208 ±    0.712    ops/s
[info] DeferredBenchmark.getBefore                                                 10          N/A       N/A           N/A      N/A        N/A  thrpt   10   3932.557 ±    4.703    ops/s
[info] DeferredBenchmark.getBefore                                                100          N/A       N/A           N/A      N/A        N/A  thrpt   10    738.829 ±    0.865    ops/s
[info] DeferredBenchmark.getBefore                                               1000          N/A       N/A           N/A      N/A        N/A  thrpt   10     80.912 ±    0.326    ops/s
[info] DispatcherBenchmark.scheduling                                             N/A          N/A       N/A           N/A     1000        N/A  thrpt   10    607.096 ±   39.404  ops/min
[info] HandleErrorBenchmark.errorRaised                                           N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3837.208 ±   41.902    ops/s
[info] HandleErrorBenchmark.happyPath                                             N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   4066.594 ±    9.424    ops/s
[info] MapCallsBenchmark.batch120                                                 N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10    330.608 ±    2.670    ops/s
[info] MapCallsBenchmark.batch30                                                  N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10     84.436 ±    0.685    ops/s
[info] MapCallsBenchmark.one                                                      N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10      2.983 ±    0.023    ops/s
[info] MapStreamBenchmark.batch120                                                N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   5409.410 ±   15.374    ops/s
[info] MapStreamBenchmark.batch30                                                 N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   2383.177 ±    4.507    ops/s
[info] MapStreamBenchmark.one                                                     N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   3208.202 ±    6.571    ops/s
[info] MutexBenchmark.cancellationConcurrent                                      N/A          N/A        10          1000      N/A        N/A  thrpt   10     39.461 ±    0.115    ops/s
[info] MutexBenchmark.cancellationConcurrent                                      N/A          N/A        50          1000      N/A        N/A  thrpt   10     17.714 ±    0.217    ops/s
[info] MutexBenchmark.cancellationConcurrent                                      N/A          N/A       100          1000      N/A        N/A  thrpt   10     11.394 ±    0.068    ops/s
[info] MutexBenchmark.happyPathConcurrent                                         N/A          N/A        10          1000      N/A        N/A  thrpt   10    318.441 ±    4.930    ops/s
[info] MutexBenchmark.happyPathConcurrent                                         N/A          N/A        50          1000      N/A        N/A  thrpt   10     62.723 ±    0.229    ops/s
[info] MutexBenchmark.happyPathConcurrent                                         N/A          N/A       100          1000      N/A        N/A  thrpt   10     31.451 ±    0.052    ops/s
[info] MutexBenchmark.highContentionConcurrent                                    N/A          N/A        10          1000      N/A        N/A  thrpt   10     59.176 ±    0.596    ops/s
[info] MutexBenchmark.highContentionConcurrent                                    N/A          N/A        50          1000      N/A        N/A  thrpt   10     11.654 ±    0.076    ops/s
[info] MutexBenchmark.highContentionConcurrent                                    N/A          N/A       100          1000      N/A        N/A  thrpt   10      5.937 ±    0.103    ops/s
[info] ParallelBenchmark.parTraverse                                              N/A        10000       N/A           N/A     1000        N/A  thrpt   10    853.043 ±    1.271    ops/s
[info] ParallelBenchmark.traverse                                                 N/A        10000       N/A           N/A     1000        N/A  thrpt   10     66.570 ±    0.206    ops/s
[info] QueueBenchmark.boundedAsyncEnqueueDequeueContended                         N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  20813.160 ±   74.471  ops/min
[info] QueueBenchmark.boundedAsyncEnqueueDequeueContendedSingleConsumer           N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  20422.536 ±  118.905  ops/min
[info] QueueBenchmark.boundedAsyncEnqueueDequeueMany                              N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  20300.179 ±   85.606  ops/min
[info] QueueBenchmark.boundedAsyncEnqueueDequeueOne                               N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  19680.439 ±   40.328  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueContended                    N/A          N/A       N/A           N/A    32768        N/A  thrpt   10   6234.804 ±   52.077  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueContendedSingleConsumer      N/A          N/A       N/A           N/A    32768        N/A  thrpt   10   8552.307 ±   58.241  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueMany                         N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  10790.883 ±   11.065  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueOne                          N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  10789.490 ±   35.135  ops/min
[info] QueueBenchmark.unboundedAsyncEnqueueDequeueContended                       N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  22742.354 ±  127.727  ops/min
[info] QueueBenchmark.unboundedAsyncEnqueueDequeueMany                            N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  46241.331 ±   97.955  ops/min
[info] QueueBenchmark.unboundedAsyncEnqueueDequeueOne                             N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  49571.957 ±  164.243  ops/min
[info] QueueBenchmark.unboundedConcurrentEnqueueDequeueContended                  N/A          N/A       N/A           N/A    32768        N/A  thrpt   10   6819.414 ±   49.832  ops/min
[info] QueueBenchmark.unboundedConcurrentEnqueueDequeueMany                       N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  10638.196 ±   41.751  ops/min
[info] QueueBenchmark.unboundedConcurrentEnqueueDequeueOne                        N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  10851.586 ±   36.718  ops/min
[info] RaceBenchmark.happyPath                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    154.709 ±    0.456    ops/s
[info] RandomBenchmark.elementOfList                                              N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  19767.340 ±  390.028    ops/s
[info] RandomBenchmark.elementOfList                                              N/A          N/A       N/A           N/A   100000        N/A  thrpt   10   4166.384 ±  152.087    ops/s
[info] RandomBenchmark.elementOfList                                              N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10    398.609 ±   11.648    ops/s
[info] RandomBenchmark.elementOfMap                                               N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  16205.862 ±   94.895    ops/s
[info] RandomBenchmark.elementOfMap                                               N/A          N/A       N/A           N/A   100000        N/A  thrpt   10   2822.757 ±   17.992    ops/s
[info] RandomBenchmark.elementOfMap                                               N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10    241.146 ±    4.950    ops/s
[info] RandomBenchmark.elementOfVector                                            N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  33722.040 ±  158.240    ops/s
[info] RandomBenchmark.elementOfVector                                            N/A          N/A       N/A           N/A   100000        N/A  thrpt   10  34259.144 ±  130.777    ops/s
[info] RandomBenchmark.elementOfVector                                            N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10  34057.178 ±  259.972    ops/s
[info] RedeemBenchmark.errorRaised                                                N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   2271.385 ±    4.889    ops/s
[info] RedeemBenchmark.happyPath                                                  N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3014.847 ±   12.761    ops/s
[info] RedeemWithBenchmark.errorRaised                                            N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3569.057 ±    7.647    ops/s
[info] RedeemWithBenchmark.happyPath                                              N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   4622.077 ±    7.941    ops/s
[info] RefBenchmark.getAndUpdate                                                  N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   6552.810 ±   20.720    ops/s
[info] RefBenchmark.modify                                                        N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   6747.748 ±   28.074    ops/s
[info] ScalQueueBenchmark.clqConcurrentEnqueueDequeue                             N/A          N/A       N/A           N/A   131072          4  thrpt   10   5596.238 ±   16.033  ops/min
[info] ScalQueueBenchmark.scalConcurrentEnqueueDequeue                            N/A          N/A       N/A           N/A   131072          4  thrpt   10   9026.835 ±   35.375  ops/min
[info] ShallowBindBenchmark.async                                                 N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   2104.535 ±    3.197    ops/s
[info] ShallowBindBenchmark.delay                                                 N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   9737.873 ±   24.183    ops/s
[info] ShallowBindBenchmark.pure                                                  N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   9936.879 ±   23.317    ops/s
[info] SleepBenchmark.sleep                                                       N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    953.285 ±    5.674  ops/min
[info] SleepBenchmark.sleepRace                                                   N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    197.855 ±    0.474  ops/min
[info] ThreadLocalBenchmark.contention                                            N/A          N/A       N/A           N/A     2000        N/A  thrpt   10    465.301 ±    2.607    ops/s
[info] WorkStealingBenchmark.alloc                                                N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10     13.901 ±    0.118  ops/min
[info] WorkStealingBenchmark.manyThreadsSchedulingBenchmark                       N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10     52.409 ±    1.124  ops/min
[info] WorkStealingBenchmark.runnableScheduling                                   N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10   2978.570 ±    5.138  ops/min
[info] WorkStealingBenchmark.runnableSchedulingScalaGlobal                        N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10   2235.488 ±    5.018  ops/min
[info] WorkStealingBenchmark.scheduling                                           N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10     52.394 ±    2.268  ops/min

After

[info] AsyncBenchmark.async                                                       N/A          N/A       N/A           N/A      100        N/A  thrpt   10  30513.524 ± 1048.629    ops/s
[info] AsyncBenchmark.bracket                                                     N/A          N/A       N/A           N/A      100        N/A  thrpt   10  23811.198 ±   82.322    ops/s
[info] AsyncBenchmark.cancelable                                                  N/A          N/A       N/A           N/A      100        N/A  thrpt   10  27393.833 ±  486.632    ops/s
[info] AsyncBenchmark.race                                                        N/A          N/A       N/A           N/A      100        N/A  thrpt   10  10518.062 ±   29.554    ops/s
[info] AsyncBenchmark.racePair                                                    N/A          N/A       N/A           N/A      100        N/A  thrpt   10  42100.630 ±  321.413    ops/s
[info] AsyncBenchmark.start                                                       N/A          N/A       N/A           N/A      100        N/A  thrpt   10  13531.348 ±   20.602    ops/s
[info] AsyncBenchmark.uncancelable                                                N/A          N/A       N/A           N/A      100        N/A  thrpt   10  35419.003 ±  131.181    ops/s
[info] AtomicCellBenchmark.cancellationAsync                                      N/A          N/A        10          1000      N/A        N/A  thrpt   10     40.415 ±    0.582    ops/s
[info] AtomicCellBenchmark.cancellationAsync                                      N/A          N/A        50          1000      N/A        N/A  thrpt   10     18.178 ±    0.102    ops/s
[info] AtomicCellBenchmark.cancellationAsync                                      N/A          N/A       100          1000      N/A        N/A  thrpt   10     11.333 ±    0.065    ops/s
[info] AtomicCellBenchmark.cancellationConcurrent                                 N/A          N/A        10          1000      N/A        N/A  thrpt   10     37.920 ±    0.872    ops/s
[info] AtomicCellBenchmark.cancellationConcurrent                                 N/A          N/A        50          1000      N/A        N/A  thrpt   10     16.991 ±    0.174    ops/s
[info] AtomicCellBenchmark.cancellationConcurrent                                 N/A          N/A       100          1000      N/A        N/A  thrpt   10     11.291 ±    0.036    ops/s
[info] AtomicCellBenchmark.happyPathAsync                                         N/A          N/A        10          1000      N/A        N/A  thrpt   10    266.804 ±    0.669    ops/s
[info] AtomicCellBenchmark.happyPathAsync                                         N/A          N/A        50          1000      N/A        N/A  thrpt   10     55.815 ±    0.130    ops/s
[info] AtomicCellBenchmark.happyPathAsync                                         N/A          N/A       100          1000      N/A        N/A  thrpt   10     27.488 ±    0.039    ops/s
[info] AtomicCellBenchmark.happyPathConcurrent                                    N/A          N/A        10          1000      N/A        N/A  thrpt   10    251.755 ±    0.717    ops/s
[info] AtomicCellBenchmark.happyPathConcurrent                                    N/A          N/A        50          1000      N/A        N/A  thrpt   10     53.201 ±    0.155    ops/s
[info] AtomicCellBenchmark.happyPathConcurrent                                    N/A          N/A       100          1000      N/A        N/A  thrpt   10     26.624 ±    0.038    ops/s
[info] AtomicCellBenchmark.highContentionAsync                                    N/A          N/A        10          1000      N/A        N/A  thrpt   10     53.896 ±    0.327    ops/s
[info] AtomicCellBenchmark.highContentionAsync                                    N/A          N/A        50          1000      N/A        N/A  thrpt   10     11.429 ±    0.329    ops/s
[info] AtomicCellBenchmark.highContentionAsync                                    N/A          N/A       100          1000      N/A        N/A  thrpt   10      5.811 ±    0.051    ops/s
[info] AtomicCellBenchmark.highContentionConcurrent                               N/A          N/A        10          1000      N/A        N/A  thrpt   10     54.381 ±    0.577    ops/s
[info] AtomicCellBenchmark.highContentionConcurrent                               N/A          N/A        50          1000      N/A        N/A  thrpt   10     11.710 ±    0.233    ops/s
[info] AtomicCellBenchmark.highContentionConcurrent                               N/A          N/A       100          1000      N/A        N/A  thrpt   10      7.088 ±    0.010    ops/s
[info] AttemptBenchmark.errorRaised                                               N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3820.275 ±    9.813    ops/s
[info] AttemptBenchmark.happyPath                                                 N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   5401.922 ±    6.353    ops/s
[info] BlockingBenchmark.blockThenCede                                            N/A          N/A       N/A           N/A    10000        N/A  thrpt   10      7.746 ±    0.063    ops/s
[info] BlockingBenchmark.coarse                                                   N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   8214.827 ±   18.690    ops/s
[info] BlockingBenchmark.fine                                                     N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   1137.763 ±    1.928    ops/s
[info] BlockingBenchmark.nested                                                   N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   1097.051 ±    1.353    ops/s
[info] BothBenchmark.happyPath                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    143.551 ±    0.469    ops/s
[info] DeepBindBenchmark.async                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3092.687 ±    5.147    ops/s
[info] DeepBindBenchmark.delay                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   9957.173 ±   19.274    ops/s
[info] DeepBindBenchmark.pure                                                     N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  11796.476 ±   44.403    ops/s
[info] DeferredBenchmark.cancel                                                    10          N/A       N/A           N/A      N/A        N/A  thrpt   10    100.311 ±    0.597    ops/s
[info] DeferredBenchmark.cancel                                                   100          N/A       N/A           N/A      N/A        N/A  thrpt   10     12.423 ±    0.137    ops/s
[info] DeferredBenchmark.cancel                                                  1000          N/A       N/A           N/A      N/A        N/A  thrpt   10      1.160 ±    0.010    ops/s
[info] DeferredBenchmark.complete                                                  10          N/A       N/A           N/A      N/A        N/A  thrpt   10    113.591 ±    0.571    ops/s
[info] DeferredBenchmark.complete                                                 100          N/A       N/A           N/A      N/A        N/A  thrpt   10     25.876 ±    0.026    ops/s
[info] DeferredBenchmark.complete                                                1000          N/A       N/A           N/A      N/A        N/A  thrpt   10      5.081 ±    0.028    ops/s
[info] DeferredBenchmark.getAfter                                                  10          N/A       N/A           N/A      N/A        N/A  thrpt   10   6959.768 ±    8.934    ops/s
[info] DeferredBenchmark.getAfter                                                 100          N/A       N/A           N/A      N/A        N/A  thrpt   10   2036.335 ±    1.472    ops/s
[info] DeferredBenchmark.getAfter                                                1000          N/A       N/A           N/A      N/A        N/A  thrpt   10    246.856 ±    0.785    ops/s
[info] DeferredBenchmark.getBefore                                                 10          N/A       N/A           N/A      N/A        N/A  thrpt   10   4000.406 ±   10.636    ops/s
[info] DeferredBenchmark.getBefore                                                100          N/A       N/A           N/A      N/A        N/A  thrpt   10    749.482 ±    2.085    ops/s
[info] DeferredBenchmark.getBefore                                               1000          N/A       N/A           N/A      N/A        N/A  thrpt   10     80.608 ±    0.231    ops/s
[info] DispatcherBenchmark.scheduling                                             N/A          N/A       N/A           N/A     1000        N/A  thrpt   10    618.197 ±   30.926  ops/min
[info] HandleErrorBenchmark.errorRaised                                           N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3536.092 ±    6.977    ops/s
[info] HandleErrorBenchmark.happyPath                                             N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   4218.186 ±    8.462    ops/s
[info] MapCallsBenchmark.batch120                                                 N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10    371.300 ±    1.792    ops/s
[info] MapCallsBenchmark.batch30                                                  N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10     95.390 ±    0.574    ops/s
[info] MapCallsBenchmark.one                                                      N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10      3.202 ±    0.038    ops/s
[info] MapStreamBenchmark.batch120                                                N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   5724.846 ±   19.036    ops/s
[info] MapStreamBenchmark.batch30                                                 N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   2464.998 ±    3.710    ops/s
[info] MapStreamBenchmark.one                                                     N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   3325.589 ±   13.675    ops/s
[info] MutexBenchmark.cancellationConcurrent                                      N/A          N/A        10          1000      N/A        N/A  thrpt   10     41.906 ±    0.817    ops/s
[info] MutexBenchmark.cancellationConcurrent                                      N/A          N/A        50          1000      N/A        N/A  thrpt   10     17.605 ±    0.219    ops/s
[info] MutexBenchmark.cancellationConcurrent                                      N/A          N/A       100          1000      N/A        N/A  thrpt   10     11.428 ±    0.108    ops/s
[info] MutexBenchmark.happyPathConcurrent                                         N/A          N/A        10          1000      N/A        N/A  thrpt   10    329.223 ±    1.518    ops/s
[info] MutexBenchmark.happyPathConcurrent                                         N/A          N/A        50          1000      N/A        N/A  thrpt   10     66.210 ±    0.245    ops/s
[info] MutexBenchmark.happyPathConcurrent                                         N/A          N/A       100          1000      N/A        N/A  thrpt   10     32.176 ±    0.164    ops/s
[info] MutexBenchmark.highContentionConcurrent                                    N/A          N/A        10          1000      N/A        N/A  thrpt   10     63.167 ±    0.125    ops/s
[info] MutexBenchmark.highContentionConcurrent                                    N/A          N/A        50          1000      N/A        N/A  thrpt   10     12.801 ±    0.316    ops/s
[info] MutexBenchmark.highContentionConcurrent                                    N/A          N/A       100          1000      N/A        N/A  thrpt   10      6.157 ±    0.034    ops/s
[info] ParallelBenchmark.parTraverse                                              N/A        10000       N/A           N/A     1000        N/A  thrpt   10    896.262 ±    0.982    ops/s
[info] ParallelBenchmark.traverse                                                 N/A        10000       N/A           N/A     1000        N/A  thrpt   10     70.027 ±    0.288    ops/s
[info] QueueBenchmark.boundedAsyncEnqueueDequeueContended                         N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  21649.532 ±   97.575  ops/min
[info] QueueBenchmark.boundedAsyncEnqueueDequeueContendedSingleConsumer           N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  20804.449 ±   99.773  ops/min
[info] QueueBenchmark.boundedAsyncEnqueueDequeueMany                              N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  20878.592 ±   39.327  ops/min
[info] QueueBenchmark.boundedAsyncEnqueueDequeueOne                               N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  20230.818 ±   67.584  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueContended                    N/A          N/A       N/A           N/A    32768        N/A  thrpt   10   6409.651 ±   46.059  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueContendedSingleConsumer      N/A          N/A       N/A           N/A    32768        N/A  thrpt   10   8803.883 ±   62.640  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueMany                         N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  10989.695 ±   30.991  ops/min
[info] QueueBenchmark.boundedConcurrentEnqueueDequeueOne                          N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  11027.536 ±   24.195  ops/min
[info] QueueBenchmark.unboundedAsyncEnqueueDequeueContended                       N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  23025.138 ±  105.224  ops/min
[info] QueueBenchmark.unboundedAsyncEnqueueDequeueMany                            N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  47874.267 ±  179.619  ops/min
[info] QueueBenchmark.unboundedAsyncEnqueueDequeueOne                             N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  50225.814 ±  192.384  ops/min
[info] QueueBenchmark.unboundedConcurrentEnqueueDequeueContended                  N/A          N/A       N/A           N/A    32768        N/A  thrpt   10   6923.056 ±   55.302  ops/min
[info] QueueBenchmark.unboundedConcurrentEnqueueDequeueMany                       N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  11033.804 ±   28.518  ops/min
[info] QueueBenchmark.unboundedConcurrentEnqueueDequeueOne                        N/A          N/A       N/A           N/A    32768        N/A  thrpt   10  11035.189 ±   38.461  ops/min
[info] RaceBenchmark.happyPath                                                    N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    159.269 ±    0.773    ops/s
[info] RandomBenchmark.elementOfList                                              N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  21348.706 ±  998.393    ops/s
[info] RandomBenchmark.elementOfList                                              N/A          N/A       N/A           N/A   100000        N/A  thrpt   10   4386.193 ±   10.280    ops/s
[info] RandomBenchmark.elementOfList                                              N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10    422.577 ±   12.018    ops/s
[info] RandomBenchmark.elementOfMap                                               N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  17526.192 ±   70.698    ops/s
[info] RandomBenchmark.elementOfMap                                               N/A          N/A       N/A           N/A   100000        N/A  thrpt   10   2946.265 ±   20.508    ops/s
[info] RandomBenchmark.elementOfMap                                               N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10    246.692 ±    6.177    ops/s
[info] RandomBenchmark.elementOfVector                                            N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  38171.147 ±  136.404    ops/s
[info] RandomBenchmark.elementOfVector                                            N/A          N/A       N/A           N/A   100000        N/A  thrpt   10  37888.257 ±  278.523    ops/s
[info] RandomBenchmark.elementOfVector                                            N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10  38174.535 ±  222.605    ops/s
[info] RedeemBenchmark.errorRaised                                                N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   2269.060 ±    5.530    ops/s
[info] RedeemBenchmark.happyPath                                                  N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3099.732 ±    3.489    ops/s
[info] RedeemWithBenchmark.errorRaised                                            N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   3488.219 ±   10.142    ops/s
[info] RedeemWithBenchmark.happyPath                                              N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   4749.183 ±   12.943    ops/s
[info] RefBenchmark.getAndUpdate                                                  N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   6892.538 ±   52.180    ops/s
[info] RefBenchmark.modify                                                        N/A          N/A       N/A           N/A      N/A        N/A  thrpt   10   7105.099 ±    9.896    ops/s
[info] ScalQueueBenchmark.clqConcurrentEnqueueDequeue                             N/A          N/A       N/A           N/A   131072          4  thrpt   10   5684.206 ±    8.651  ops/min
[info] ScalQueueBenchmark.scalConcurrentEnqueueDequeue                            N/A          N/A       N/A           N/A   131072          4  thrpt   10   9231.853 ±   26.084  ops/min
[info] ShallowBindBenchmark.async                                                 N/A          N/A       N/A           N/A    10000        N/A  thrpt   10   2168.857 ±    5.131    ops/s
[info] ShallowBindBenchmark.delay                                                 N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  10121.488 ±   29.994    ops/s
[info] ShallowBindBenchmark.pure                                                  N/A          N/A       N/A           N/A    10000        N/A  thrpt   10  10537.404 ±   15.314    ops/s
[info] SleepBenchmark.sleep                                                       N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    971.602 ±    0.488  ops/min
[info] SleepBenchmark.sleepRace                                                   N/A          N/A       N/A           N/A    10000        N/A  thrpt   10    198.751 ±    0.351  ops/min
[info] ThreadLocalBenchmark.contention                                            N/A          N/A       N/A           N/A     2000        N/A  thrpt   10    482.267 ±    3.043    ops/s
[info] WorkStealingBenchmark.alloc                                                N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10     13.907 ±    0.100  ops/min
[info] WorkStealingBenchmark.manyThreadsSchedulingBenchmark                       N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10     49.412 ±    1.542  ops/min
[info] WorkStealingBenchmark.runnableScheduling                                   N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10   2939.898 ±    6.665  ops/min
[info] WorkStealingBenchmark.runnableSchedulingScalaGlobal                        N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10   2235.162 ±    3.394  ops/min
[info] WorkStealingBenchmark.scheduling                                           N/A          N/A       N/A           N/A  1000000        N/A  thrpt   10     52.460 ±    3.205  ops/min

@djspiewak
Copy link
Member

Getting back around to analyzing the benchmark…

Almost zero change outside the margin of error. Where it is changed, this branch is faster (weird?!), so I call that a win!

@djspiewak djspiewak merged commit 74b2b74 into typelevel:series/3.5.x Nov 23, 2023
28 of 32 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

IO.raiseError(...) doesn't immediately surface fatal errors
6 participants