Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 12.12.2014
Сообщений: 87

Целесообразность использования свойств вместо public полей в приложениях, где важна скорость

24.03.2018, 01:14. Показов 749. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Visual Studio в том коде, который я пишу для решения одной числодробильной задачи, упорно подсказывал мне о необходимости заменять поля классов на свойства. Решил проверить, как это скажется на производительности. См. код под спойлером.
Кликните здесь для просмотра всего текста

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
66
67
68
69
70
71
72
73
    public static class Test_Performance04
    {
 
        public class AccessWithProperty
        {
            public double v1 { get; private set; }
            public double v2 { get; private set; }
            public double v3 { get; private set; }
 
            public AccessWithProperty()
            {
                v1 = 1; v2 = 2; v3 = 3;
            }
 
            public void Calculate()
            {
                v1 = v1 * 2;
                v2 = v2 * 3 + v1;
                v3 = v3 * 4 + v2;
            }
        }
 
 
        public class DirectAccess
        {
            public double v1;
            public double v2;
            public double v3;
 
            public DirectAccess()
            {
                v1 = 1; v2 = 2; v3 = 3;
            }
 
            public void Calculate()
            {
                v1 = v1 * 2;
                v2 = v2 * 3 + v1;
                v3 = v3 * 4 + v2;
            }
        }
 
 
        public static void run()
        {
            int n = 100000000;
 
            DateTime t = new DateTime();
 
            t = DateTime.Now;
            AccessWithProperty accessWithProperty = new AccessWithProperty();
            double sum1 = 0;
            for (int i=0; i<n; i++)
            {
                accessWithProperty.Calculate();
                sum1 += accessWithProperty.v1 + accessWithProperty.v2 + accessWithProperty.v3;
            }
 
            Console.WriteLine($"accessWithProperty time: {(DateTime.Now - t).TotalSeconds:0.00000}");
 
            t = DateTime.Now;
            DirectAccess directAccess = new DirectAccess();
            double sum2 = 0;
            for (int i = 0; i < n; i++)
            {
                directAccess.Calculate();
                sum2 += directAccess.v1 + directAccess.v2 + directAccess.v3;
            }
 
            Console.WriteLine($"directAccess time: {(DateTime.Now - t).TotalSeconds:0.00000}");
        }
 
    }


Сказалось очень печально, скорость выполнения для такого простенького примера снизилась более, чем в 5 раз:
Code
1
2
3
accessWithProperty time: 3,52715
directAccess time: 0,62944
конец main
Однако, если в настройках сборки поставить галочку "Оптимизировать код", то получаем почти равный результат:
Code
1
2
3
accessWithProperty time: 0,41508
directAccess time: 0,41166
конец main
В данном случае я имел дело с простым примером.
Будет ли оптимизация кода работать также эффективно для более сложного кода?
Имеет ли смысл везде вместо открытых полей писать свойства, даже если знаешь, что почти наверняка там будут только get/set по умолчанию, и не бояться, что это может негативно повлиять на производительность?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2018, 01:14
Ответы с готовыми решениями:

Так ли важна в реальной жизни скорость записи SSD, или смотреть надо только на скорость чтения, а на запись пофигу
https://www.citilink.ru/catalog/computers_and_notebooks/hdd/ssd_in/420250/ вот у него скорость записи низкая, но он самый популярный

Целесообразность использования цикла.
Этот момент в универе нам не объясняли. Хочу сразу сказать, я знаю зачем, как и когда используются циклы. Собственно возник не большой...

Целесообразность использования LINQ
Доброго времени суток, уважаемые! Хочу немного освоить (понять &quot;соль&quot;) ASP.net MVC и пр. сопутствующих технологий. Так как уже...

3
 Аватар для Fleder
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
24.03.2018, 05:48
Цитата Сообщение от Thor Посмотреть сообщение
Сказалось очень печально, скорость выполнения для такого простенького примера снизилась более, чем в 5 раз
Всё правильно. Компилятор при отключенной оптимизации честно подставляет для каждого геттера-сеттера ассемблерную команду call.
И это вносит дополнительный оверхэд на процессорное время.

Цитата Сообщение от Thor Посмотреть сообщение
Однако, если в настройках сборки поставить галочку "Оптимизировать код", то получаем почти равный результат
При включенных оптимизациях JIT инлайнит свойства.
Фактически вызов свойств превращается в прямое обращение к полям.

Цитата Сообщение от Thor Посмотреть сообщение
Будет ли оптимизация кода работать также эффективно для более сложного кода?
Чтобы не гадать, можно подстраховаться:
C#
1
2
3
4
5
6
7
8
9
10
11
12
   public class SomeClass
   {
      public int A { get; private set; }
 
      public int B { get; private set; }
 
      public int Foo
      {
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         get => (A * 2 + B * 2) - 1;
      }
   }
Здесь свойство Foo будет принудительно заинлайнено.
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
24.03.2018, 05:53
Щас бы через DateTime время выполнения кода замерять...
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,304
24.03.2018, 12:07
Thor, в релизной конфигурации свойства заменяются прямым обращением к полям класса, если в свойствах нет никакой логики. Поэтому оверхед от свойств (без логики) нулевой.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2018, 12:07
Помогаю со студенческими работами здесь

Целесообразность использования близких ключевых
Почитав Форум пришел к выводу что колючевые &quot;мой товар&quot;, &quot;мои товары&quot;, мой луйчший товар&quot; это три совершенно разных ключевых. Но...

Целесообразность использования глобальных счётчиков
В своём коде я выработал привычку всегда объявлять счётчики глобальными. Например вместо: ... int main() { ... for(int i00 = 0;...

В каких случаях важна скорость преобразования матриц?
Добрый день! Подскажите, пожалуйста, примеры практического применения операций над матрицами (транспонирование, умножение и др.), когда...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru