Re: Оптимизация public (ООП)
Добавлено:
22 июн 2016, 21:55
lawsonilka
Автор, Вы наверное первый человек в мире которому я также как дымок посоветую почитать книги по программированию в целом для начала. обычно я их кетегорически не рекомендую.
Re: Оптимизация public (ООП)
Добавлено:
23 июн 2016, 19:22
bwolf88
Всё же непонятно, откуда 20% разницы?
У вас разница именно в этом тесте ?
Такие тесты на доступ нужно делать чистыми, ну или с минимальными вычислениями, с присвоением каждого результата переменной вне функции.
А в вашем случае 20% могут вылезти из-за разницы функций (лишний вызов метода внутри).
Re: Оптимизация public (ООП)
Добавлено:
23 июн 2016, 19:33
waruiyume
Чавой, я согласился что скорость одинакова, а тест объяснял почему я пришёл к такому, ошибочному, выводу.
Подходы в тесте отличаются только тем, что в методе используется разность 3 флотов, а в свойстве вычисляется, заранее, разность Vector3.
Re: Оптимизация public (ООП)
Добавлено:
24 июн 2016, 00:11
Cr0c
waruiyume писал(а):Чавой, я согласился что скорость одинакова, а тест объяснял почему я пришёл к такому, ошибочному, выводу.
Подходы в тесте отличаются только тем, что в методе используется разность 3 флотов, а в свойстве вычисляется, заранее, разность Vector3.
Второй цикл отличается ещё и вычислением разницы векторов же... магнитуда вычисляется же только при обращении к ней или при задании вектора сразу же?
Re: Оптимизация public (ООП)
Добавлено:
24 июн 2016, 13:02
ReinDeer
Cr0c писал(а):waruiyume писал(а):Чавой, я согласился что скорость одинакова, а тест объяснял почему я пришёл к такому, ошибочному, выводу.
Подходы в тесте отличаются только тем, что в методе используется разность 3 флотов, а в свойстве вычисляется, заранее, разность Vector3.
Второй цикл отличается ещё и вычислением разницы векторов же... магнитуда вычисляется же только при обращении к ней или при задании вектора сразу же?
При обращении. Конструктор не содержит ничего кроме присвоения XYZ, а метод магнитуды просто return Mathf.Sqrt(a.x * a.x + a.y * a.y + a.z * a.z);
Re: Оптимизация public (ООП)
Добавлено:
24 июн 2016, 13:15
waruiyume
Что-то я не улавливаю смысла.
Re: Оптимизация public (ООП)
Добавлено:
24 июн 2016, 13:17
ReinDeer
waruiyume писал(а):Что-то я не улавливаю смысла.
Крок спросил, вычисляется ли магнитуда при создании вектора или только самим методом. Я посмотрел ILSpy конструктор и сам метод. Никаких намеков на сохранение. Да и не логично было бы делать перерасчет на каждое изменение.
Re: Оптимизация public (ООП)
Добавлено:
24 июн 2016, 15:49
seaman
В тесте выше разницу вижу только в том, то 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}");
}
}
}
Разницы не вижу...
Re: Оптимизация public (ООП)
Добавлено:
26 июн 2016, 10:11
lawsonilka
я как выглядит get и set в this?
типа:
Используется csharp
public int this [int index] {
get {}
set {}
}
Re: Оптимизация public (ООП)
Добавлено:
26 июн 2016, 10:33
seaman
VS есть? В ней есть утилита ildasm. Найди и изучай что хочешь...
Re: Оптимизация public (ООП)
Добавлено:
29 июн 2016, 16:29
Cr0c
ReinDeer писал(а):Да и не логично было бы делать перерасчет на каждое изменение.
В списке при доступе к записи индекс приводится к uint при проверке границ. А при получении значения поля неприведенный индекс используется. Тоже как-то не логично, лишние преобразования == уменьшенное быстродействие. Вот я и уточнил, раз воможность была.