Оптимизация public (ООП)

Программирование на Юнити.

Re: Оптимизация public (ООП)

Сообщение lawsonilka 22 июн 2016, 21:55

Автор, Вы наверное первый человек в мире которому я также как дымок посоветую почитать книги по программированию в целом для начала. обычно я их кетегорически не рекомендую.
lawsonilka
UNIверсал
 
Сообщения: 390
Зарегистрирован: 21 окт 2014, 14:48

Re: Оптимизация public (ООП)

Сообщение bwolf88 23 июн 2016, 19:22

Всё же непонятно, откуда 20% разницы?

У вас разница именно в этом тесте ?
Такие тесты на доступ нужно делать чистыми, ну или с минимальными вычислениями, с присвоением каждого результата переменной вне функции.
А в вашем случае 20% могут вылезти из-за разницы функций (лишний вызов метода внутри).
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Оптимизация public (ООП)

Сообщение waruiyume 23 июн 2016, 19:33

Чавой, я согласился что скорость одинакова, а тест объяснял почему я пришёл к такому, ошибочному, выводу.
Подходы в тесте отличаются только тем, что в методе используется разность 3 флотов, а в свойстве вычисляется, заранее, разность Vector3.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация public (ООП)

Сообщение Cr0c 24 июн 2016, 00:11

waruiyume писал(а):Чавой, я согласился что скорость одинакова, а тест объяснял почему я пришёл к такому, ошибочному, выводу.
Подходы в тесте отличаются только тем, что в методе используется разность 3 флотов, а в свойстве вычисляется, заранее, разность Vector3.

Второй цикл отличается ещё и вычислением разницы векторов же... магнитуда вычисляется же только при обращении к ней или при задании вектора сразу же?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Оптимизация public (ООП)

Сообщение ReinDeer 24 июн 2016, 13:02

Cr0c писал(а):
waruiyume писал(а):Чавой, я согласился что скорость одинакова, а тест объяснял почему я пришёл к такому, ошибочному, выводу.
Подходы в тесте отличаются только тем, что в методе используется разность 3 флотов, а в свойстве вычисляется, заранее, разность Vector3.

Второй цикл отличается ещё и вычислением разницы векторов же... магнитуда вычисляется же только при обращении к ней или при задании вектора сразу же?

При обращении. Конструктор не содержит ничего кроме присвоения XYZ, а метод магнитуды просто return Mathf.Sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
ReinDeer
UNец
 
Сообщения: 21
Зарегистрирован: 25 янв 2015, 15:11
Откуда: Ульяновск
Skype: nya.rein.deer

Re: Оптимизация public (ООП)

Сообщение waruiyume 24 июн 2016, 13:09

Какой конструктор?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация public (ООП)

Сообщение ReinDeer 24 июн 2016, 13:14

waruiyume писал(а):Какой конструктор?

Vector2,3
ReinDeer
UNец
 
Сообщения: 21
Зарегистрирован: 25 янв 2015, 15:11
Откуда: Ульяновск
Skype: nya.rein.deer

Re: Оптимизация public (ООП)

Сообщение waruiyume 24 июн 2016, 13:15

Что-то я не улавливаю смысла.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Оптимизация public (ООП)

Сообщение ReinDeer 24 июн 2016, 13:17

waruiyume писал(а):Что-то я не улавливаю смысла.

Крок спросил, вычисляется ли магнитуда при создании вектора или только самим методом. Я посмотрел ILSpy конструктор и сам метод. Никаких намеков на сохранение. Да и не логично было бы делать перерасчет на каждое изменение.
ReinDeer
UNец
 
Сообщения: 21
Зарегистрирован: 25 янв 2015, 15:11
Откуда: Ульяновск
Skype: nya.rein.deer

Re: Оптимизация public (ООП)

Сообщение seaman 24 июн 2016, 15:49

В тесте выше разницу вижу только в том, то Distance - один метод, а во втором случае - два. Вызов оператора минус а затем вызов magnitude. Ну и потом - это компилируется Моно. Там все же всяких оптимизация поменьше, чем в VS.
Вот возьмите такой консольный benchmark чисто для VS:
Синтаксис:
Используется csharp
using System;
using System.Diagnostics;

namespace PropertyBenchmark
{
    class Program
    {
        private const int __ARRAY_LENGTH = 1000000;
        private const int __REPEATS = 1000;
        private const long __ALL_COUNT = __ARRAY_LENGTH * __REPEATS;

        static private readonly Stopwatch __timer = new Stopwatch();

        static private readonly float[] __floatOnHeap = new float[__ARRAY_LENGTH];
        static private readonly TestClass __testClass = new TestClass();

        static void Main(string[] args)
        {
            float[] floatOnStack = new float[__ARRAY_LENGTH];

            //HEAP
            long methodResult = 0;
            long propertyResult = 0;
            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    __floatOnHeap[i] = __testClass.GetFloat();
                }
                __timer.Stop();
                methodResult += __timer.ElapsedTicks;
            }

            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    __floatOnHeap[i] = __testClass.PropertyFloat;
                }
                __timer.Stop();
                propertyResult += __timer.ElapsedTicks;
            }

            Console.WriteLine($"GET on heap. Method - {methodResult}. Property - {propertyResult}. Ratio - {(double)methodResult / propertyResult}");
            //Console.WriteLine($"GET on heap. Method - {(double)methodResult / __ALL_COUNT}. Property - {(double)propertyResult / __ALL_COUNT}. Ratio - {(double)methodResult / propertyResult}");

            methodResult = 0;
            propertyResult = 0;
            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    __testClass.SetFloat(__floatOnHeap[i]);
                }
                __timer.Stop();
                methodResult += __timer.ElapsedTicks;
            }

            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    __testClass.PropertyFloat = __floatOnHeap[i];
                }
                __timer.Stop();
                propertyResult += __timer.ElapsedTicks;
            }

            Console.WriteLine($"SET on heap. Method - {methodResult}. Property - {propertyResult}. Ratio - {(double)methodResult / propertyResult}");
            //Console.WriteLine($"SET on heap. Method - {(double)methodResult / __ALL_COUNT}. Property - {(double)propertyResult / __ALL_COUNT}. Ratio - {(double)methodResult / propertyResult}");

            //STACK
            methodResult = 0;
            propertyResult = 0;
            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    floatOnStack[i] = __testClass.GetFloat();
                }
                __timer.Stop();
                methodResult += __timer.ElapsedTicks;
            }
           
            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    floatOnStack[i] = __testClass.PropertyFloat;
                }
                __timer.Stop();
                propertyResult += __timer.ElapsedTicks;
            }

            Console.WriteLine($"GET on stack. Method - {methodResult}. Property - {propertyResult}. Ratio - {(double)methodResult / propertyResult}");
            //Console.WriteLine($"GET on stack. Method - {(double)methodResult / __ALL_COUNT}. Property - {(double)propertyResult / __ALL_COUNT}. Ratio - {(double)methodResult / propertyResult}");

            methodResult = 0;
            propertyResult = 0;
            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    __testClass.SetFloat(floatOnStack[i]);
                }
                __timer.Stop();
                methodResult += __timer.ElapsedTicks;
            }

            for (int j = 0; j < __REPEATS; j++)
            {
                __timer.Reset();
                __timer.Start();
                for (int i = 0; i < __ARRAY_LENGTH; i++)
                {
                    __testClass.PropertyFloat = floatOnStack[i];
                }
                __timer.Stop();
                propertyResult += __timer.ElapsedTicks;
            }

            Console.WriteLine($"SET on stack. Method - {methodResult}. Property - {propertyResult}. Ratio - {(double)methodResult / propertyResult}");
            //Console.WriteLine($"SET on stack. Method - {(double)methodResult / __ALL_COUNT}. Property - {(double)propertyResult / __ALL_COUNT}. Ratio - {(double)methodResult / propertyResult}");
        }
    }
}

Изображение
Разницы не вижу...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Оптимизация public (ООП)

Сообщение lawsonilka 26 июн 2016, 10:11

я как выглядит get и set в this?
типа:
Синтаксис:
Используется csharp
public int this [int index] {
 get {}
 set {}
}
lawsonilka
UNIверсал
 
Сообщения: 390
Зарегистрирован: 21 окт 2014, 14:48

Re: Оптимизация public (ООП)

Сообщение seaman 26 июн 2016, 10:33

VS есть? В ней есть утилита ildasm. Найди и изучай что хочешь...
Изображение
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Оптимизация public (ООП)

Сообщение Aslan125 29 июн 2016, 15:59

olimpset писал(а):Знаю, много public переменных пагубно влияет на производительность.


:-o
Aslan125
UNец
 
Сообщения: 2
Зарегистрирован: 07 янв 2015, 14:31

Re: Оптимизация public (ООП)

Сообщение Cr0c 29 июн 2016, 16:29

ReinDeer писал(а):Да и не логично было бы делать перерасчет на каждое изменение.

В списке при доступе к записи индекс приводится к uint при проверке границ. А при получении значения поля неприведенный индекс используется. Тоже как-то не логично, лишние преобразования == уменьшенное быстродействие. Вот я и уточнил, раз воможность была.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Пред.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18