4 / 4 / 2
Регистрация: 22.04.2015
Сообщений: 58
|
||||||
1 | ||||||
Интересный эксперимент, но неочевидный результат08.10.2017, 19:17. Показов 1025. Ответов 3
Решил провести эксперимент, выявив примерно на сколько больше времени потребуется для выполнения преобразования типов коллекций из ICollection в List. К этому меня сподвинула ситуация, где я "foreach" конструкцией могу пробежать по всем элементам коллекции, а вот в "for" конструкции не могу, т.к. ICollection не реализует доступ к элементу по индексу и для этого приходится делать явное преобразование к типу List/Ilist.
Пример с кодом:
С чем связанны такие ускорения/замедления? У меня есть лишь одно предположение, что в момент нагрузки - начинают увеличиваться процессорные такты и в результате скорость выполнения спустя время возрастает. Можно, конечно, проверить выводом тактовой частоты "до и после" замеров, но пока не стал заморачиваться. Глядя в аиду - разницу не заметил, но и обновляется она примерно раз в сек. В общем отсюда выплывает и второй вопрос. Как адекватно производить замеры, чтобы в каких то случаях просчитать производительность, в то время как существуют такого рода бусты скорости?
0
|
08.10.2017, 19:17 | |
Ответы с готовыми решениями:
3
Купленный хард Blue Caviar 1Тб программа показывает интересный результат Неочевидный хи-квадрат Эксперимент Эксперимент |
08.10.2017, 20:11 | 2 |
В вашем коде - нисколько. Преобразования по сути нет, потому что
List<T> и так реализует ICollection<T> . А хранимый в поле объект - List<T>.Вы можете заменить свойство ICollection<Header> HeaderList на List<Header> HeaderList и ничего не изменится.Разница в скорости из-за повторного обращения к тем же элементам массива. Оптимизация. Да, можно даже одинаковые циклы поставить. 2 foreach или 2 for. Например, делают т.н. "прогрев". Сравнение производительности С++ и C#.
1
|
Администратор
|
|
08.10.2017, 20:57 | 3 |
Сообщение было отмечено -JR- как решение
Решение
C JIT компиляцией скорее всего.
Там довольно много особенностей которые следует иметь в виду - Тест лучше выполнять на машине где не запущено ничего кроме самого теста - Настройки питания ОС желательно выставить на максимум производительности - Тест следует запускать отдельное от среды разработки - Код теста следует настроить так чтобы выполнение шло в одном и том же потоке (за исключением случая тестирования многопоточности) - Перед выполнением кода теста и замерами следует сделать несколько разогревающих прогонов чтобы JIT компиляция на влияла на замеры - Перед самим тестом желательно выполнить полную сборку мусора чтобы свести влияние GC к минимуму - Код следует компилировать в Release конфигурации - При написании теста не забывать про возможные оптимизации компилятора и писать код так что они не повлияли на тест - Нужно делать несколько прогонов одного теста и считать среднее время исполнения - Тесты желательно выполнять для разных архитектур т.к. есть разница между кодом который генерируют x86 и x64 JIT компиляторы Хорошим подспорьем в написании микро-бенчмарков является библиотека BenchmarkDotNet
1
|
4 / 4 / 2
Регистрация: 22.04.2015
Сообщений: 58
|
|
09.10.2017, 12:25 [ТС] | 4 |
Благодарю за ответы
0
|
09.10.2017, 12:25 | |
09.10.2017, 12:25 | |
Помогаю со студенческими работами здесь
4
Эксперимент Эксперимент Эксперимент с регионами Мысленный эксперимент Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |