Garbage Collector и строки

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

Garbage Collector и строки

Сообщение craw1er 07 фев 2016, 13:19

Привет!

Тут пишут, что если часто делать сложение строк, как в примере ниже, то это будет генерировать много мусора и тормозить игру:

Синтаксис:
Используется csharp
 void Update() {
        string scoreText = "Score: " + score.ToString();
        scoreBoard.text = scoreText;
}


Вопрос: Частое разделение строк Split-ом тоже тормозит игру?

Синтаксис:
Используется csharp
void Update() {
        string[] infoArray = info.Split('#');
}
тут могло быть что-то умное
Аватара пользователя
craw1er
UNец
 
Сообщения: 41
Зарегистрирован: 14 апр 2009, 00:10

Re: Garbage Collector и строки

Сообщение jetyb 08 фев 2016, 07:56

System.Diagnostics.Stopwatch в помощь
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Garbage Collector и строки

Сообщение waruiyume 08 фев 2016, 08:03

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

Re: Garbage Collector и строки

Сообщение jetyb 08 фев 2016, 09:44

С чего бы освобождение памяти, да еще и в отдельном потоке сборщика мусора, тормозило больше, чем выделение памяти, которое как раз и измеряется Stopwatch-ем в методе?
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Garbage Collector и строки

Сообщение waruiyume 08 фев 2016, 12:16

С того, что это более сложная процедура.
http://docs.unity3d.com/Manual/Understa ... ement.html
<<У меня сложилось мнение что множество людей думают, что выделение на стеке дёшевы, а в куче — дороги. Но на самом деле это практически одинаковые по времени операции, обычно. Но вот процесс освобождение памяти — это само освобождение памяти, дефрагментация и перемещение объектов из поколения в поколение, всё вместе это очень значительные перемещения блоков памяти в сравнении с тем, что мы видим на стеке.>>
http://habrahabr.ru/post/221915/
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Garbage Collector и строки

Сообщение KBEP 13 мар 2016, 23:08

Можно конвертировать в строку не каждый Update, а только когда значение score изменилось:
Синтаксис:
Используется csharp
int prevScore;

void Update() {
        if (prevScore != score)
        {
                 string scoreText = "Score: " + score.ToString();
                 scoreBoard.text = scoreText;
                 prevScore = score;
        }
}
Аватара пользователя
KBEP
Старожил
 
Сообщения: 598
Зарегистрирован: 24 сен 2012, 23:23
Откуда: Калининград, СПб, Северодвинск

Re: Garbage Collector и строки

Сообщение DualPain 14 мар 2016, 15:18

еще можно использовать StringBuilder
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09

Re: Garbage Collector и строки

Сообщение DbIMok 14 мар 2016, 15:24

DualPain писал(а):StringBuilder

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

Re: Garbage Collector и строки

Сообщение DualPain 14 мар 2016, 15:33

DbIMok писал(а):
DualPain писал(а):StringBuilder

каждый фрейм для двух строк? нет смысла

для двух может и нет, но не стоит забывать о его существовании
DualPain
Старожил
 
Сообщения: 727
Зарегистрирован: 11 янв 2013, 01:18
Skype: demon21.09


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

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

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