Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
4 / 4 / 2
Регистрация: 22.04.2015
Сообщений: 58
1

Интересный эксперимент, но неочевидный результат

08.10.2017, 19:17. Показов 1025. Ответов 3

Author24 — интернет-сервис помощи студентам
Решил провести эксперимент, выявив примерно на сколько больше времени потребуется для выполнения преобразования типов коллекций из ICollection в List. К этому меня сподвинула ситуация, где я "foreach" конструкцией могу пробежать по всем элементам коллекции, а вот в "for" конструкции не могу, т.к. ICollection не реализует доступ к элементу по индексу и для этого приходится делать явное преобразование к типу List/Ilist.

Пример с кодом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.Diagnostics;
 
namespace ConsoleApplication1
{
    class ClearProgram
    {
        public ICollection<Header> HeaderList { get; set; }
 
        public static void Main()
        {
            ClearProgram p = new ClearProgram();
 
            p.HeaderList = new List<Header>()
            {
               new Header { Id =1, Text = "sdfsdfwefwefeerfef", WebPageId =1 },
                new Header { Id =2, Text = "sdfsdfeerfewefweff", WebPageId =2 },
                 new Header { Id =3, Text = "sdfsdfwef21eerfef", WebPageId =3 },
                  new Header { Id =4, Text = "sdfsdf1sveeerfef", WebPageId =4 },
                   new Header { Id =5, Text = "sdfsd12e12efeerfef", WebPageId =5 },
                   new Header { Id =6, Text = "sdfsdfeerfef", WebPageId =6 },
                  new Header { Id =7, Text = "sdfsdf112eeerfef", WebPageId =7 },
                  new Header { Id =8, Text = "sdfs2fef", WebPageId =8 },
                  new Header { Id =9, Text = "sdfsdfeerfef", WebPageId =9 },
                   new Header { Id =10, Text = "sdfsdfef1erfef", WebPageId =10 },
            };
 
            var text = "";
            var text2 = "";
 
            Stopwatch timer1 = new Stopwatch();
            timer1.Start();
 
            foreach (var header in p.HeaderList)
            {
                text += header.Text + '\n';
            }
 
            timer1.Stop();
            Console.WriteLine(timer1.Elapsed);
 
            //////////////////////////////////////////////////////////////////////
 
            Stopwatch timer2 = new Stopwatch();
            timer2.Start();
 
            for (int i = 0; i < p.HeaderList.Count; i++)
            {
                text2 += ((List<Header>)p.HeaderList)[i].Text + '\n';
            }
 
            timer2.Stop();
            Console.WriteLine(timer2.Elapsed);
        }
    }
 
    public class Header
    {
        public int Id { get; set; }
        public string Text { get; set; }
 
        public int WebPageId { get; set; }
    }
}
К моему большому удивлению был получен результат с разницей почти в 20 раз, где вторая конструкция с преобразованием в List<> оказалась значительно быстрее чем foreach.

00:00:00.0006910
00:00:00.0000385
Для продолжения нажмите любую клавишу . . .
После чего решил проверить каждую из них по отдельности, и оказалсоь, что в начале программы - скорость для первого цикла - замедляется, а для второго - возрастает. И не важно в каком порядке они идут, последний цикл - всегда быстрее чем первый.

С чем связанны такие ускорения/замедления?
У меня есть лишь одно предположение, что в момент нагрузки - начинают увеличиваться процессорные такты и в результате скорость выполнения спустя время возрастает. Можно, конечно, проверить выводом тактовой частоты "до и после" замеров, но пока не стал заморачиваться. Глядя в аиду - разницу не заметил, но и обновляется она примерно раз в сек.

В общем отсюда выплывает и второй вопрос. Как адекватно производить замеры, чтобы в каких то случаях просчитать производительность, в то время как существуют такого рода бусты скорости?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2017, 19:17
Ответы с готовыми решениями:

Купленный хард Blue Caviar 1Тб программа показывает интересный результат
Здравствуйте! Купил недавно Western Digital Caviar Blue WD10EZEX 1 ТБ, даже недели не прошло. ...

Неочевидный хи-квадрат
Господа, приветствую. Есть проблема (файл в приложении). Две группы пациентов (HTT и PFY),...

Эксперимент
Други, подмогните плиз. решил поставить Эксперимент: 1. есть домен 3-го уровня (февраль 2005...

Эксперимент
Чисто для эксперимента: какой максимальной размерности можно создать динамический массив в...

3
Эксперт .NET
10570 / 6494 / 1506
Регистрация: 25.05.2015
Сообщений: 19,669
Записей в блоге: 14
08.10.2017, 20:11 2
Цитата Сообщение от -JR- Посмотреть сообщение
на сколько больше времени потребуется для выполнения преобразования типов коллекций из ICollection в List
В вашем коде - нисколько. Преобразования по сути нет, потому что List<T> и так реализует ICollection<T>. А хранимый в поле объект - List<T>.
Вы можете заменить свойство ICollection<Header> HeaderList на List<Header> HeaderList и ничего не изменится.
Цитата Сообщение от -JR- Посмотреть сообщение
С чем связанны такие ускорения/замедления?
Разница в скорости из-за повторного обращения к тем же элементам массива. Оптимизация.
Цитата Сообщение от -JR- Посмотреть сообщение
и оказалсоь, что в начале программы - скорость для первого цикла - замедляется, а для второго - возрастает
Да, можно даже одинаковые циклы поставить. 2 foreach или 2 for.
Цитата Сообщение от -JR- Посмотреть сообщение
Как адекватно производить замеры, чтобы в каких то случаях просчитать производительность
Например, делают т.н. "прогрев". Сравнение производительности С++ и C#.
1
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,353
Записей в блоге: 1
08.10.2017, 20:57 3
Лучший ответ Сообщение было отмечено -JR- как решение

Решение

Цитата Сообщение от -JR- Посмотреть сообщение
С чем связанны такие ускорения/замедления?
C JIT компиляцией скорее всего.

Цитата Сообщение от -JR- Посмотреть сообщение
Как адекватно производить замеры, чтобы в каких то случаях просчитать производительность, в то время как существуют такого рода бусты скорости?
Там довольно много особенностей которые следует иметь в виду
- Тест лучше выполнять на машине где не запущено ничего кроме самого теста
- Настройки питания ОС желательно выставить на максимум производительности
- Тест следует запускать отдельное от среды разработки
- Код теста следует настроить так чтобы выполнение шло в одном и том же потоке (за исключением случая тестирования многопоточности)
- Перед выполнением кода теста и замерами следует сделать несколько разогревающих прогонов чтобы 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2017, 12:25
Помогаю со студенческими работами здесь

Эксперимент
(Время: 1 сек. Память: 16 Мб Баллы: 100) Ученые в одной сверхсекретной лаборатории проводят...

Эксперимент
И так, был создан сайт, на котором было размещено 100% не уникального контента (100 страниц) ,...

Эксперимент с регионами
Помогите в небольшом эксперименте. Необходимо выложить сюда скриншот выдачи гугла по запросу...

Мысленный эксперимент
добрый день. мой настоящий пост больше относится к области фантастики, но и к физике тоже :) так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru