2016-10-28 2 views
3

"performace tips" section of the Julia manual에 따르면 다중 발송으로 미친 짓을하는 것은 바람직하지 않습니다. 나는 내가 정의하는 타입에 대해 3 개의 매개 변수가 필요한 상황에 처했습니다. 이것은 using only 1 parameter for 2 possible types에 대한 내 질문과 관련이 있습니다. 나는 단순히 다른 매개 변수를 사용하여이 제시 한 어려움을 해결할 수있는 실현하지만줄리아 : 여러 매개 변수의 효율성

type mytype{R<:Real, S<:Any, T<:Any} 
    x::Matrix{R} 
    y::Dict{Int64, Vector{S}} 
    z::Dict{T, Vector{Int64}} 
end 

가 파견 여러 매개 변수를 가진 성능의 interms이 권할 수있는 것처럼 다음 내 타입이 보인다. 그런 다음 mytype의 함수가 3 개의 매개 변수에 전달되고 함수 인수가 올바른 것입니까?

답변

5

괜찮습니다. 원하는만큼 유형에 여러 번 발송하십시오. 그것이 바로 그 때문입니다.

정말로 원하지 않는 것; 문서의 해당 부분이 너무 많이 전달되는 경우 값. 유형 매개 변수로 을 사용하여 수행 할 수있는 작업은 다음과 같습니다.

값을 디스패치 할 때 동적 디스패치가 발생하는 경향이있는 경향이 있습니다. 즉, 형식 매개 변수로 값이있는 함수를 호출하는 함수는 호출 할 함수를 알면 특수화 할 수 없습니다. 이것은 유형 불안정성과 밀접한 관련이 있습니다. 그것은 optimiser를 많이 죽일 수 있고, 줄리아가 파이썬처럼 느리게 돌아 가게 할 수 있습니다.

Here is 내 코드의 일부가 틀림없이 "너무 멀리"가치가있는 것으로 보입니다. Val{T} 유형을 광범위하게 사용합니다.이 유형은 디스패치 값만 허용합니다. 매우 표현적이고 매우 간결하지만 동일한 코드만큼 빠르게 실행하거나 조건문을 사용하거나 사전 조회를 사용하지 않습니다. (이 경우에는 기꺼이 할 가치가 있습니다.)

사용자 지정 유형에 값을 형식 매개 변수로 저장해서는 안되는 문서도 있습니다. 특히 당신이 그들에게 파견하기조차하지 않는다면. 그것이 바로 분야가되는 것입니다.

+0

감사합니다.이 유형에 대한 자세한 내용 (유형 vs 값)을 읽어야합니다. 이번에 두 가지 질문을 사용했는지 확인 했습니까?) – mv3

5

괜찮습니다. 당신은 그냥 쓸 수 있습니다 참고로 : 당신이 계산의 적지 않은 양을하고있는 대부분의 경우

type mytype{R<:Real, S, T} 
    x::Matrix{R} 
    y::Dict{Int64, Vector{S}} 
    z::Dict{T, Vector{Int64}} 
end 

은 (유형)에 고정 유형은 성능 좋은 것입니다. 작은 함수를 인라인으로 호출하는 경우 (대부분의 경우 v0.5에서 자동으로 수행되지만 @inline으로 도울 수 있음) 어쨌든 함수 호출에 비용이 들지 않으며 아무 것도 걱정하지 않아도됩니다.

언제나 벤치마킹하여 직접 확인하십시오. 주로 여기에있는 문제는 많은 수의 값 유형에서 비롯됩니다.

+2

인수를 지나치게 지정하거나 "엄격하게 입력"해도 일반적으로 성능이 향상되지 않습니다. http://docs.julialang.org/en/latest/manual/performance-tips/#type-declarations 코드를 덜 범용으로 만드십시오. 성능이 아닌 행위 파견 및 구조에 유형 선언을 사용하십시오. –

+2

기능상, 예, 타입 정보가 디스패치에 전혀 도움이되지 않습니다. 타입이 다르다 : 모든 타입을 'Any'로 만들고 타입 - 추론이 잘되지 않을 것이다. 느슨하게 유형을 지정하고 유형을 엄격하게 만듭니다. –

+0

@Isaiah 잠깐, 이것에 대해 궁금합니다. 예를 들어'function (n :: Int64)'은 성능면에서'function (n)'보다 낫지 않습니까? – mv3