키가있는 일부 좌표를 참조 할 때 모든 유형의 효율적인 패턴 일치를 허용하기 때문에 차별화 된 유니온 유형을 사용하려고했습니다.구분 된 유니온 유형에 대한 빠른 CustomEquality 및 CustomComparison 구현
[<CustomEquality; CustomComparison>]
type Coord =
| Spot of AssetKey
| Vol of AssetKey * DateTime option
| Rate of Currency
.....
member this.sortKey =
match this with
| Spot(key) -> (0 , key.toString)
| Vol(key) -> (1 , key.toString)
| Vol(key, Some(t)) -> (2 , key.toString + t.ToShortString())
| Rate(cur) -> (3 , cur.toString)
......
interface IComparable with
member this.CompareTo(obj) =
match obj with
| :? Coord as other -> compare this.sortKey other.sortKey
| _ -> invalidArg "obj" "not a Coord type"
override this.Equals(obj) =
match obj with
| :? Coord as other -> this.sortKey = other.sortKey
| _ -> false
override this.GetHashCode() = this.sortKey.GetHashCode()
내가 특정 정렬 순서를 적용해야합니다
은 때라도 코드 snipet를 생각해 보자. 예를 들면 Spot < Vol 항상 있습니다. 나는 sortKey 멤버 함수로이를 시행한다. 그래서 모두가 잘 작동
[<StructuralEqualityAttribute; StructuralComparisonAttribute>]
type AssetKey =
| Equity of string
| EquityIndex of string
.....
하지만 느린 :
AssetKey은 다시 매우 유사한 차별 노동 조합 유형입니다. 멀리 볼 수있는 한 sortKey 함수가 호출되면 전체 키가 다시 작성되며 특히 toString 함수가 다시 호출됩니다.
하나의 명백한 개선점은 솔루션보다 해킹 된 캐싱 레이어를 추가하는 것입니다.
추가 최적화는 문자열에 해시 키를 사용하는 것입니다. 하지만 여기서도 캐시를 추가해야 할 것입니다. 왜냐하면 해시 키를 캐시에 저장해야하기 때문에 다시 계산할 필요가 없기 때문입니다.
내가 구조체 또는 클래스를 사용하면 성능 최적화가 쉬울 것,하지만 내가 좋아하는 패턴 매칭의 유연성을 잃어 잘 수행하는 또 다른 방법이 될 것입니다 무엇
match c with
| Coord.Vol(ak, _) when ak = assetKey -> true
| _ -> false
예를
하시나요? 일부 타이밍에서는 전체 성능의 30 % 이상이 sortKey 함수에서 손실됩니다.의견과 제안을 보내 주셔서 감사합니다.
안녕하세요. 첫 번째 버전을 구현했으며 약 100 배 빠릅니다. 여기 내 구현은 다음과 같습니다. – Daniel