Замеры скорости выполнения участка кода

Раздел, посвящённый самому важному - скорости.

Замеры скорости выполнения участка кода

Сообщение deeffoora 20 май 2016, 18:10

Подскажите что я неправильно понимаю?
Значит, делаю замер скорости участка кода, используя класс StopWatch. При небольшом количестве итераций в цикле (~700) затраченное время 5мс. В статистике ~70 кадров, время на кадр ~ 13 мс. Далее значительно увеличиваю количество итераций в цикле (~40тыс.). Затраченное время 45мс (что тоже удивительно, должно как бы быть в десятки раз больше, а не в десять раз, но вопрос не в этом). А вот в статистике 1,3 кадра, время на кадр ~800мс.

Куда делись ~750мс?

Может таймер врать?
deeffoora
UNец
 
Сообщения: 11
Зарегистрирован: 12 июн 2015, 18:22

Re: Замеры скорости выполнения участка кода

Сообщение DbIMok 20 май 2016, 18:42

код, скриншоты?
deeffoora писал(а):При небольшом количестве итераций в цикле (~700) затраченное время 5мс

цикл у вас в одном кадре? тогда при чем тут статистика с количеством кадров и временем на кадр? если не в одном, то что вы измеряете?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Замеры скорости выполнения участка кода

Сообщение deeffoora 20 май 2016, 19:49

Перебор двумерного массива в каждом кадре

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

        var c = new TSUtility.CodeTimer("time");// Вкл. таймера

        int index = 0;
        float weight = int.MaxValue;
        for (int i = 0; i <= DJMatrix.GetUpperBound(0); i++)
        {
            float current_weight = 0;
            for (int j = 0; j <= DJMatrix.GetUpperBound(1); j++)
                if (ListUnits[j].activeSelf)
                    current_weight += weight_matrix[DJMatrix[i, j].i, DJMatrix[i, j].j];

            if (current_weight < weight)
            {
                weight = current_weight;
                index = i;
            }

        }

        c.Dispose();//Выкл. таймера

 


Скрины.

В первом варианте замера размер массива 5040х7. Таймер намерял на участок кода 5 - 6мс.

https://yadi.sk/i/hZvCweCNrsKsp

Во втором варианте замера размер массива 40320х8. Таймер намерял на участок кода 55 - 60мс.

https://yadi.sk/i/2HGMwfLPrsKqZ

То есть, в десять раз увеличилось время обработки. Это логично. А вот если обратить внимание на STAT, то тут разница в рендеринге кадров в семьдесят раз!
deeffoora
UNец
 
Сообщения: 11
Зарегистрирован: 12 июн 2015, 18:22

Re: Замеры скорости выполнения участка кода

Сообщение DbIMok 20 май 2016, 19:57

на Stats внимание не обращайте
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Замеры скорости выполнения участка кода

Сообщение deeffoora 20 май 2016, 20:34

Да, я бы и рад. Но у меня напрочь замораживается юнити. Камерой не могу двинуть. Такое впечатление, что там не один кадр в секунду, а 0,01. Завершаю юнити только через диспетчер задач, в итоге.

Изначально я хотел размазать эти процедуры в корутинах, так как они кушают много, как видно. Решил попрофилировать, чтоб понять какими порциями размазывать, чтоб не мешать в кадрах выполняться первостепенным задачам. И натолкнулся на такое непредсказуемое поведение.
deeffoora
UNец
 
Сообщения: 11
Зарегистрирован: 12 июн 2015, 18:22

Re: Замеры скорости выполнения участка кода

Сообщение Cr0c 20 май 2016, 21:18

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

Re: Замеры скорости выполнения участка кода

Сообщение DbIMok 20 май 2016, 21:23

задача похожа на чисто вычислительную, не связанную с элементами движка. значит ее можно вынести в отдельный поток.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Замеры скорости выполнения участка кода

Сообщение deeffoora 20 май 2016, 22:21

Да, вы правы. Это чисто вычислительная задача. Вычисляются некие подмножества множеств. Можно и в потоке это делать. И, по-поводу динамического вычисления порций, тоже верно. Это сделаю как профилирование по корутинам пойдет нормально. Пока коряжится, но постепенно чего-то уже вырисовывается.
deeffoora
UNец
 
Сообщения: 11
Зарегистрирован: 12 июн 2015, 18:22

Re: Замеры скорости выполнения участка кода

Сообщение Cr0c 21 май 2016, 09:28

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

Re: Замеры скорости выполнения участка кода

Сообщение jetyb 16 июн 2016, 12:31

Всяких там выделений\освобождений памяти между кадрами нет?
Массив DJMatrix не пересоздается?

Кстати, вертикальную синхронизацию для строгости замеров отключили?
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21


Вернуться в Оптимизация

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

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