如题
比如使用typeof(v) === t是否导致jit受阻?
是在普通的function里用,还是在@generated
function里?
类型会不断改变的代码基本都是JIT不友好的Julia代码吧。
话说这个@generated
function里面变量直接就是type的吧,和他说的应该不是一个问题,不过如果如要做typeof的判断的时候用个@generated
function应该算是个好选择(语义受限,不一定都好改)。
2 个赞
普通函数。generated function要手动抓闭包才能用,不适合做代码生成。我目的是做通用的代码生成来着。。
可以用 @code_warntype
来检查。比如说
julia> foo(::Type{Val{1}}) = 1; foo(::Type{Val{2}}) = 2;
julia> goo(n) = foo(Val{n})
goo (generic function with 1 method)
julia> @code_warntype foo(Val{1})
Body::Int64
1 1 ─ return 1 │
julia> @code_warntype goo(1)
Body::Int64
1 1 ─ %1 = (Core.apply_type)(Main.Val, n)::Type{Val{_1}} where _1 │
│ %2 = (isa)(%1, Type{Val{1}})::Bool │
└── goto #3 if not %2 │
2 ─ goto #6 │
3 ─ %5 = (isa)(%1, Type{Val{2}})::Bool │
└── goto #5 if not %5 │
4 ─ goto #6 │
5 ─ %8 = (Main.foo)(%1)::Int64 │
└── goto #6 │
6 ┄ %10 = φ (#2 => 1, #4 => 2, #5 => %8)::Int64 │
└── return %10 │
这里Julia编译器不可能知道
goo
里面的 foo
会接受到什么数据类型,所以“JIT不友好”。每次调用 goo
Julia都会找应该用 foo
的哪个method。(如下)如果你看到类似于 ::Type{Val{_1}} where _1
或者在 @code_warntype
中显示出红色。那么就是“JIT不友好”。
julia> methods(foo)
# 2 methods for generic function "foo":
[1] foo(::Type{Val{1}}) in Main at REPL[1]:1
[2] foo(::Type{Val{2}}) in Main at REPL[1]:1
4 个赞
很好, 赞, nice(凑齐八字