ジュリア(V0.5)は、パフォーマンスの低下につながる、次のように定数伝播しません:ディスパッチせずにif文を定数に伝播できますか?
julia> g(::Int) = true
g (generic function with 1 method)
julia> f(x) = g(x) ? 1 : 1.0
f (generic function with 1 method)
julia> @code_warntype f(1)
Variables:
#self#::#f
x::Int64
Body:
begin
unless $(QuoteNode(true)) goto 3
return 1
3:
return 1.0
end::Union{Float64,Int64}
はその代わりに、私は次の操作を実行する必要があります。
julia> g(::Int) = Val{true}
g (generic function with 1 method)
julia> f_(::Type{Val{true}}) = 1
f_ (generic function with 1 method)
julia> f_(::Type{Val{false}}) = 1.0
f_ (generic function with 2 methods)
julia> f(x) = f_(g(x))
f (generic function with 1 method)
これは動作しますが、それは定義が必要です追加のコンパイル時オーバーヘッドを作成する追加の機能。このオーバーヘッドなしでv0.5で動作する既存のソリューションはありますか?
これは、スタックオーバーフローの問題よりもパフォーマンス上の問題が多いようです。 – StefanKarpinski
@StefanKarpinskiコンパイラはすでに定数伝播、インライン展開、推論を行っていますが、これらのステップは繰り返し実行でき、_ad nauseum_を組み合わせることができるので、コンパイル時間を不当にせずに最高のパフォーマンスを保証する方法はありません。だから私は、既存の行動と連携する方法が存在するかどうかに興味があります。 –
@StefanKarpinskiそれにもかかわらず、私は問題https://github.com/JuliaLang/julia/issues/17880を提出しました。 –