Для ссылки на некоторые координаты с помощью ключей я хотел использовать дискриминационные типы объединений, потому что они обеспечивают эффективное сопоставление с образцом всех видов.
Обратите внимание на следующий фрагмент кода:
[<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()
Мне нужно установить определенный порядок сортировки.Например, Spot
AssetKey - снова очень похожий тип различаемого объединения:
[<StructuralEqualityAttribute; StructuralComparisonAttribute>]
type AssetKey =
| Equity of string
| EquityIndex of string
.....
Так что все это работает хорошо, но медленно.Насколько я понимаю, если вызывается функция sortKey, весь ключ создается снова, в частности, функции toString вызываются снова.
Одним очевидным улучшением было бы добавление слоя кэширования, которыйскорее взлом, чем решение.
Дальнейшая оптимизация будет заключаться в использовании хеш-ключа в строках.Но здесь я снова должен добавить кеширование, потому что мне нужно кешировать ключ хеша, и я не хочу пересчитывать его заново.
Оптимизация производительности была бы проще, если бы я использовал структуру или класс, но тогда я потерял бы гибкость сопоставления с образцом, как, например,
match c with
| Coord.Vol(ak, _) when ak = assetKey -> true
| _ -> false
Каким был бы альтернативный подход, которыйхорошо работает?В некоторые из моих временных интервалов 30% и более от общей производительности теряется в функции sortKey.
Спасибо за любые предложения и улучшения.