Question about Static Readonly Field optimization in Tier 2 JIT ASM
According to this article about dotnet 7 performance improvements:
There are various things the JIT can learn about a method during tier-0 that it can then use for tier-1. For example, the very fact that the tier-0 code executed means that any statics accessed by the method will have been initialized, and that means that any readonly statics will not only have been initialized by the time the tier-1 code executes but their values won’t ever change.I wondered what would happen if the value of this field was changed after a constant was compiled into assembly. You are still able to change the field value with unsafe code (Reflection throws a
FieldAccessException
).
In this example the disassembled code shows how the Test()
method has been reduced to only a constant. However, running the program shows that updating the value of the static readonly field the method also updates. How does this work? Am I testing something wrong, or is the JIT able to detect the fact that the field as been altered and recompile the method?
Program output:
ASM via benchmarkdotnet
CS:
Stephen Toub - MSFT
.NET Blog
Performance Improvements in .NET 7 - .NET Blog
.NET 7 is fast. Really fast. This post deep-dives into hundreds of performance improvements that contributed to that reality.
4 Replies
This is a big old "undefined behavior" question
What happens may vary in a number of ways, depending on a number of factors. The behavior of your test here is really only indicative of your test, and not general behavior
well i’m curious as to some potential reasons why
Go ask in #allow-unsafe-blocks
alright thank you