I’m getting very different results, much less dramatic. But didn’t use the test runner, I pasted the code into a console mode app. The 5% result is ~87% in 32-bit mode, ~100% in 64-bit mode when I try it.
Alignment is critical on doubles, the .NET runtime can only promise an alignment of 4 on a 32-bit machine. Looks to me the test runner is starting the test methods with a stack address that’s aligned to 4 instead of 8. The misalignment penalty gets very large when the double crosses a cache line boundary.