Насколько серьезным будет снижение производительности при использовании квалификатора AsReference?

Я должен решить, хочу ли я сбрить дополнительные 5 КБ из 550 КБ, квалифицировав свойство с помощью AsReference. Ведь 5К — это лишь часть от общего числа — менее 1%. Тем не менее, если потеря производительности минимальна — почему бы и нет?

Спасибо.

Пояснение

Использование AsReference действительно уменьшает размер, если на самом деле есть общие ссылки. Мой вопрос касается производительности или грубо говоря - скорости.


person mark    schedule 26.07.2011    source источник
comment
stackoverflow .com/questions/6463460/   -  person Mitch Wheat    schedule 26.07.2011
comment
Спасибо, что направили меня к моему старому вопросу. Я отредактировал вопрос - добавил уточнение.   -  person mark    schedule 26.07.2011


Ответы (1)


Очевидно, это будет зависеть от модели, и сериализация и десериализация здесь будут разными. Для моделей среднего размера накладные расходы по производительности будут минимальными, за исключением, конечно, того, что на самом деле сериализации будет меньше (при условии, что существует разумное количество повторяющихся экземпляров объекта, помеченных AsReference; если их вообще нет тогда накладные расходы, хотя и минимальные, тратятся впустую). И если ссылка означает, что мы избегаем повторной сериализации большой ветки данных (возможно, подколлекции и т. д.), то мы можем получить очень хорошую экономию как для ЦП, так и для полосы пропускания.

Любые затраты здесь ощущаются исключительно из-за сериализации, поскольку проблематичной частью является проверка того, видели ли мы объект раньше. Во время десериализации это просто извлечение элементов из списка по индексу, так что очень быстро.

Также обратите внимание, что я предполагаю, что DynamicType здесь отключено, так как это отдельная проблема (опять же, влияние сведено к минимуму).

повторное хранение; в настоящее время поддерживается плоский список и проверяется на ссылочное равенство. Я хотел бы использовать поиск по хеш-таблице/словарю, но у меня есть опасения по поводу типов, которые переопределяют GetHashCode()/Equals, и, к сожалению, невозможно получить доступ к исходному методу экземпляра object.GetHashCode(). Это означает, что для очень большого количества элементов, помеченных AsReference (и здесь я имею в виду много-много тысяч объектов в графе), он может медленно деградировать (поиск будет O(N) для растущего списка длина Н). Изменение этого на поиск по хешу сделает его O (1) при каждом поиске.

Подумав вслух, мы могли бы возможно сделать что-то, когда сможем доказать, что тип не переопределяется (хотя это требует дополнительных размышлений, что само по себе является проблемой), или мы могли бы просто поверьте, что пользователь не испортит GetHashCode() и т. д., и используйте их определение равенства, чтобы обозначить равенство на графике. Я открыт для размышлений, но в настоящее время ссылочное равенство используется как самый безопасный и простой вариант.

Для реальных цифр: это сильно зависит от вашей модели и размера; поскольку у вас есть удобная модель и вы знаете размер с/без AsReference, вы, по-видимому, в состоянии обернуть это в Stopwatch или подобное (предпочтительно в что-то вроде MemoryStream, чтобы вы не включали затраты на диск / ввод-вывод во время) .

person Marc Gravell    schedule 26.07.2011
comment
Спасибо за этот подробный ответ. - person mark; 26.07.2011
comment
@Марк, вместо того, чтобы выполнять поиск O (N) уже встреченных объектов в плоском списке во время сериализации, не могли бы вы выполнить поиск O (1) в словаре‹int, object›, где ключом является идентификатор, возвращенный из ObjectIdGenerator (который использует RuntimeHelpers.GetHashCode() внутри)? - person Anders Forsgren; 04.08.2011
comment
@Андерс, о, круто; RuntimeHelpers.GetHashCode() — это метод, о котором я говорил (не найдя) выше. С этим я могу написать поиск хэша ссылочного равенства, конечно - person Marc Gravell; 04.08.2011