Очевидно, это будет зависеть от модели, и сериализация и десериализация здесь будут разными. Для моделей среднего размера накладные расходы по производительности будут минимальными, за исключением, конечно, того, что на самом деле сериализации будет меньше (при условии, что существует разумное количество повторяющихся экземпляров объекта, помеченных AsReference
; если их вообще нет тогда накладные расходы, хотя и минимальные, тратятся впустую). И если ссылка означает, что мы избегаем повторной сериализации большой ветки данных (возможно, подколлекции и т. д.), то мы можем получить очень хорошую экономию как для ЦП, так и для полосы пропускания.
Любые затраты здесь ощущаются исключительно из-за сериализации, поскольку проблематичной частью является проверка того, видели ли мы объект раньше. Во время десериализации это просто извлечение элементов из списка по индексу, так что очень быстро.
Также обратите внимание, что я предполагаю, что DynamicType
здесь отключено, так как это отдельная проблема (опять же, влияние сведено к минимуму).
повторное хранение; в настоящее время поддерживается плоский список и проверяется на ссылочное равенство. Я хотел бы использовать поиск по хеш-таблице/словарю, но у меня есть опасения по поводу типов, которые переопределяют GetHashCode()
/Equals
, и, к сожалению, невозможно получить доступ к исходному методу экземпляра object.GetHashCode()
. Это означает, что для очень большого количества элементов, помеченных AsReference
(и здесь я имею в виду много-много тысяч объектов в графе), он может медленно деградировать (поиск будет O(N) для растущего списка длина Н). Изменение этого на поиск по хешу сделает его O (1) при каждом поиске.
Подумав вслух, мы могли бы возможно сделать что-то, когда сможем доказать, что тип не переопределяется (хотя это требует дополнительных размышлений, что само по себе является проблемой), или мы могли бы просто поверьте, что пользователь не испортит GetHashCode()
и т. д., и используйте их определение равенства, чтобы обозначить равенство на графике. Я открыт для размышлений, но в настоящее время ссылочное равенство используется как самый безопасный и простой вариант.
Для реальных цифр: это сильно зависит от вашей модели и размера; поскольку у вас есть удобная модель и вы знаете размер с/без AsReference
, вы, по-видимому, в состоянии обернуть это в Stopwatch
или подобное (предпочтительно в что-то вроде MemoryStream
, чтобы вы не включали затраты на диск / ввод-вывод во время) .
person
Marc Gravell
schedule
26.07.2011