Насколько серьезно, если вообще, снижение производительности за использование квалификатора AsReference? - PullRequest
1 голос
/ 26 июля 2011

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

Спасибо.

Уточнение

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

1 Ответ

2 голосов
/ 26 июля 2011

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

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

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

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

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

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

...