Сравнительные тесты скорости расчетов типов данных

Оптимизация кода.

Re: Сравнительные тесты скорости расчетов типов данных

Сообщение bwolf88 10 дек 2014, 23:09

Выжимать то, что есть надо только когда этого потребует ситуация, а не постоянно.

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

Re: Сравнительные тесты скорости расчетов типов данных

Сообщение bwolf88 27 дек 2014, 13:46

Еще тест сравнения скорости Bounds и простых индексов векторов (либо чисел). А я их только недавно у себя в генераторе сетки понатыкал :(

Синтаксис:
Используется csharp

 Bounds b = new Bounds(Vector3.zero, new Vector3(10, 10, 10));
    void test1()
    {
        for (int i = 0; i < 1000; i++)
        {
            for (int x = (int)b.min.x; x < b.max.x; x++)
            {
                for (int y = (int)b.min.y; y < b.max.y; y++)
                {
                    for (int z = (int)b.min.z; z < b.max.z; z++)
                    {
                        float bc = Random.value;
                    }
                }
            }
        }
        //123 ms
    }

    void test2()
    {
        for (int i = 0; i < 1000; i++)
        {
            float x1 = b.min.x; float x2 = b.max.x;
            float y1 = b.min.y; float y2 = b.max.y;
            float z1 = b.min.z; float z2 = b.max.z;
            for (int x = (int)x1; x < x2; x++)
            {
                for (int y = (int)y1; y < y2; y++)
                {
                    for (int z = (int)z1; z < z2; z++)
                    {
                        float bc = Random.value;
                    }
                }
            }
        }
        //55 ms
    }

    void test3()
    {
        Vector3 bc = new Vector3(4, 4, 4);
        for (int i = 0; i < 100000; i++)
        {
            if (CheckWorldBound(bc)) { float c = Random.value; } //проверка на вхождение простым сравнением чисел
        }
         //11 мс
    }

   bool CheckWorldBound(Vector3 bc)
    {
        Vector3 min = new Vector3(-5, -5, -5);
        Vector3 max = new Vector3(5, 5, 5);
        if (bc.x > min.x && bc.x < max.x && bc.y > min.y && bc.y < max.y && bc.z > min.z && bc.z < max.z) return true;
        else return false;
    }

    void test4()
    {
        Vector3 bc = new Vector3(4, 4, 4);
        for (int i = 0; i < 100000; i++)
        {
            if (b.Contains(bc)) { float c = Random.value; }
        }
        //20.5 ms
    }

 
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Сравнительные тесты скорости расчетов типов данных

Сообщение Lailore 28 дек 2014, 01:35

Вот такой тест более корректен по моему(3 и 4 тесты, 1 и 2 я вообщене не понял зачем).
Синтаксис:
Используется csharp
using System.Diagnostics;
using UnityEngine;
using Debug = UnityEngine.Debug;

public class Test : MonoBehaviour {
    private Bounds b = new Bounds(Vector3.zero, new Vector3(10, 10, 10));

    private void Start() {
        var sw = Stopwatch.StartNew();
        test1();
        sw.Stop();
        Debug.Log(sw.ElapsedMilliseconds);

        sw.Start();
        test2();
        sw.Stop();
        Debug.Log(sw.ElapsedMilliseconds);

        sw.Start();
        test3();
        sw.Stop();
        Debug.Log(sw.ElapsedMilliseconds);

        sw.Start();
        test4();
        sw.Stop();
        Debug.Log(sw.ElapsedMilliseconds);
    }

    private void test1() {
        for (var i = 0; i < 1000; i++) {
            for (var x = (int) b.min.x; x < b.max.x; x++) {
                for (var y = (int) b.min.y; y < b.max.y; y++) {
                    for (var z = (int) b.min.z; z < b.max.z; z++) {
                        var bc = Random.value;
                    }
                }
            }
        }
    }

    private void test2() {
        for (var i = 0; i < 1000; i++) {
            var x1 = b.min.x;
            var x2 = b.max.x;
            var y1 = b.min.y;
            var y2 = b.max.y;
            var z1 = b.min.z;
            var z2 = b.max.z;
            for (var x = (int) x1; x < x2; x++) {
                for (var y = (int) y1; y < y2; y++) {
                    for (var z = (int) z1; z < z2; z++) {
                        var bc = Random.value;
                    }
                }
            }
        }
    }

    private void test3() {
        var bc = new Vector3(4, 4, 4);
       
        var testStruct = new TestStruct(new Vector3(-5, -5, -5), new Vector3(5, 5, 5));
        for (var i = 0; i < 100000; i++) {
            testStruct.Contains(bc);
        }
    }

   private void test4() {
        var bc = new Vector3(4, 4, 4);
        for (var i = 0; i < 100000; i++) {
            b.Contains(bc);
        }
    }

   
}

public struct TestStruct {
    public readonly Vector3 Max;
    public readonly Vector3 Min;

    public TestStruct(Vector3 min, Vector3 max) {
        Min = min;
        Max = max;
    }

    public bool Contains(Vector3 bc) {
        return bc.x >= Min.x && bc.x <= Max.x && bc.y >= Min.y && bc.y <= Max.y && bc.z >= Min.z && bc.z <= Max.z;
    }
}
 


Мои измерения показывают ооочень маленькую разницу(которую врятли надо брать в расчет, 100% горлышко производительности в другом месте), и я думаю она из-за http://docs.unity3d.com/ScriptReference ... sects.html
Аватара пользователя
Lailore
UNIт
 
Сообщения: 148
Зарегистрирован: 08 дек 2014, 23:53

Re: Сравнительные тесты скорости расчетов типов данных

Сообщение bwolf88 28 дек 2014, 05:59

Возможно.
Первые два теста для проверки всех вхождений в объем с заданным шагом. Обращение к Bounds медленнее, чем если один раз записать границы и проверять по ним.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Пред.

Вернуться в Код

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

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