Здравствуйте, Ikemefula, Вы писали:
I>>>"прирост до 50 раз " @ vdimas
V>>Этот множитель сложился из двух множимых. См. исходный пост на русском языке: http://www.rsdn.ru/forum/philosophy/4843592.1.aspxАвтор: vdimas
Дата: 05.08.12
.
I>То есть, ты разницу между IList и List помножил на разницу между ручной и встроеной серилизацией ?
Наоборот, разделил общий эффект на разницу м/у ручной и встроенной сериализацией, чтобы получить прирост от тупой замены абстрактных типов на конкретные.
I>Но по любому , ты снова ошибся хотя уже не на порядок
Нет.
I>Итого, максимальная разница между List и IList в 2.5 раза. С valuetype вместо object разница еще меньше, всего 1.5 раза.
I>Вероятно "от 3-х до ~10-ти" ты получил вообще на пустых итерациях
Итого, у тебя опять работает заведомо синтетика и заведомо некорректная. Даю тебе вторую попытку. Вместо 10КК прогонов по циклу попробуй прогон по десяткам элементов (это ближе к реальной задаче сериализации разветвленного графа объекта в памяти), а внешний цикл пусть будет 10КК/x, где x — кол-во элементов.
Сразу получишь более 3-х раз разницы (у меня — 3.75). Ну а потом погоняй стоимость вызова других методов, например стоимость обращения к элементу по индексу (иначе нахрена именно IList??).
В общем, более 8-ми раз на реальных задачах выходила разница из-за простой замены IList<> на конкретные типы. По приведенной ссылке — результаты с реального проекта.
Думаю, более корректным будет тест с глубиной вложенности объектов хотя бы 2. Т.е. было бы неплохо сделать коллекцию в коллекции, разбив эти 100 элементов хотя бы 10*10.
V>>А теперь тебе надо бъяснить пассаж насчет Enumerable.ElementAt.
I>Объясняю — использование List может быть очень дорогим удовольствием, а хочется, что бы некоторые функции вроде Linq2Objects работали крайне быстро, выход — IList<>
Это не объяснение, а туманность Андромеды. Покажи, где IList<> будет быстрее List<>.
I>>>Успокойся, не волнуйся, твои сценарии самые-самые, и да, это не беда, что только у тебя они используются.
I>>>Для моих сценариев IList<> в самый раз, просто потому что List<> это ОЧЕНЬ дорогой контейнер. Настолько дорогой, что использовать его нельзя во многих сценариях.
V>>Дык, никто не мешает использовать любые конкретные типы, в т.ч. обычный массив. И таки, если речь об итерировании, то итерирование по List<> нифига не дорогое удовольствие, в отличие от IList<>.
I>Ты похоже не понимаешь — если List это очень дорого, то и массив тоже будет так же дорого.
Да, пока что не понимаю, пока ты не показал, где IList<> будет быстрее List<>.
I>Реальная разница в 2.5 раза на почти пустой итерации. Если цикл чуть сложнее суммы элементов, эта разница становится ничтожной.
Для задач просто чтения элементов, о которой речь в сериализации, разница оказалась катастрофической. При десериализации тоже тоже оказалась в несколько раз, бо при десериализации используются те самые остальные методы интерфейса List/IList для наполнения коллекций.