结合内联和非可变布尔模块属性的场景中的JIT优化

Ste*_*sen 5 .net optimization f# jit

在以下程序中,

module Program

let condition = System.DateTime.Now.Millisecond % 2 = 0

let inline reliesOnCondition (x:int) =
    if condition then
        printfn "%i" x

[<EntryPoint>]
let main args =
    reliesOnConditional System.DateTime.Now.Second
    0
Run Code Online (Sandbox Code Playgroud)

reliesOnCondition System.DateTime.Now.Second如果condition模块加载结果是假的,JIT会优化表达式吗?

Han*_*ant 2

赞成的答案是不正确的,属性访问器间接寻址通常不会阻止 JIT 优化器忽略死代码。大多数简单的都是内联的,并考虑它们的编译时间值。这意味着它不会优化表达式,因为条件的值仅在运行时已知。事实上,在已知条件值后对代码进行抖动并不会改变这一点,优化器必须能够静态地确定该值。这里只有一个文字就足够了,你会得到一个带有条件编译的文字(C# 中的#if)。检查此答案以获取有关优化器的更多背景信息。