为什么Julia编译器不优化此循环?

Rem*_*i.b 2 compiler-construction compilation julia

我对编译知之甚少,但我很惊讶Julia编译器没有优化多个进程.

让我们考虑Julia(这是一个即时编译器),让我们考虑这两个基本相同的代码.

n=1
@time for i = 1:10^8 n=n+1 end
elapsed time: 3.535394087 seconds (0 bytes allocated)

n=1
@time n=n+10^8
elapsed time: 6.599e-6 seconds (112 bytes allocated)
Run Code Online (Sandbox Code Playgroud)

为什么是一个现代化的编译器不能够理解这漫长的循环会做什么,但添加10^8n

我认为以下例子更引人注目

n=1
@time for i = 1:10^9 n=n end
elapsed time: 3.496573198 seconds (0 bytes allocated)
Run Code Online (Sandbox Code Playgroud)

waT*_*eim 11

在全局范围内执行时这是一个问题,并且在类型可能发生变化的情况下与优化相关联,但在适当的情况下,情况会发生变化.在函数中约束求值允许编译器做更多的事情.在一个函数中考虑相同的事情.

function f(n::Int64)
   x = 0;
   for i = 1:n
      x = x + 1;
   end
   return x;
end


julia> @time f(100)
elapsed time: 2.93e-6 seconds (80 bytes allocated)
100

julia> @time f(Int64(1e11))
elapsed time: 4.632e-6 seconds (112 bytes allocated)
100000000000
Run Code Online (Sandbox Code Playgroud)

通过使用code_native检查编译器输出,您可以看到循环已优化

julia> code_native(f,(Int64,)) 

Source line: 6
    push    RBP
    mov RBP, RSP
    test    RDI, RDI
    jg  L15
    xor EDI, EDI
Source line: 6
L15:    mov RAX, RDI 
    pop RBP
    ret
Run Code Online (Sandbox Code Playgroud)