Основные способы оптимизации производительности


Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Notice: Функция get_currentuserinfo с версии 4.5.0 считается устаревшей! Используйте wp_get_current_user(). in /hlds/web/u138079p19/code4life.ru/htdocs/wp-includes/functions.php on line 3840

Для real-time приложений производительность очень важна, а если приложение еще и критично по времени исполнения, то производительность является ключевым фактором. Вопросам оптимизации производительности должно уделять достаточно времени. При разработке скриптового языка s4g мы не раз сталкивались с низкой производительностью. И каждый раз нам приходилось решать задачи по ускорению исполнения кода. Речь идет именно о повышении производительности C++ кода. Однако, не всегда, казалось бы очевидные приемы оптимизации, действительно ведут к оптимизации.

Рассмотрим главные тормоза и способы их решения

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

Динамическое выделение памяти — способ выделения памяти (в так называемой «куче»/»heap») приложению операционной системой, во время исполнения приложения.

В данном случае можно ускорить исполнение до нескольких сотен раз! Что надо сделать? Надо выделять память пачками, чтобы одним new создать сразу несколько объектов. В нашем случае уже был такой инструмент, специальный класс пул памяти, который выделял нужное количество памяти для определенного класса объектов.

Чтобы сократить время исполнения, придется для некоторой части объектов, наиболее часто создающихся, создавать некий управляемый пул памяти, и брать память под объекты только из него.

Однако при таком подходе решается еще одна, не маловажная проблема.

Фрагментация оперативной памяти

наличие в оперативной памяти большого количества мелких не смежных участков неиспользуемой памяти (не занятых).

Для производительности это плохо. Вкратце — вместо того чтобы брать объект из памяти рядом с текущим объектом придется неизвестно сколько прыгать по оперативной памяти до искомого объекта. Возможно не совсем точное описание, но суть ясна.

Также это плохо в случае если больших участков для объектов не останется (все будет в мелких участках, и порой эта совокупность мелких участков может превышать требуемый объем для одного большого), то есть большой по объему памяти объект не будет создан.

Путь решения это организация пула памяти (для конкретных объектов к примеру), и возможность сортировать память, перемещая объекты в дальних участках по ближе к началу. Однако это тоже затратная операция, поэтому ее исполнение нежелательно в участках кода критичным ко времени исполнения.

Рекурсия

самовызов.

Управлять рекурсией в некоторых задачах достаточно тяжело, тем более она замедляет исполнение, так как требуется вызов функции самой себя.

Избавится от рекурсии в большинстве случаев можно циклом.

Когда в s4g мы убрали рекурсию, мы смогли сами контролировать вложенность (в которую входит и рекурсия) в скриптах, тем самым мы перестали зависеть от стека исполнения C++, и ввели свои собственные ограничения, что крайне удобно.

Еще способы оптимизации производительности

Константные объект. В s4g существовали константные объекты это null, true, false. Зачем их создавать каждый раз когда мы делаем a = true ? Можно хранить все эти объекты и запретить их модификацию, тем самым выигрывая в скорости.

Функции интринсики (intrinsics functions) — функции реализации которых? специально обрабатываются компилятором и как правило заменяются на последовательность инструкций, аналогично inline функции. Однако, про интринсики компилятор знает намного больше чем про inline функции, поэтому может лучше встроить интринсик в данную ситуацию. Однако для этого в настройках компилятора необходимо поставить оптимизацию. Некоторую информацию об интринсиках можно найти на wiki.

На примере нашего движка SkyXEngine мы смогли поднять производительность с 5 кадров в секунду до 20, при помощи математической библиотеки с использованием интринсиков.


Это далеко не полный перечень возможных оптимизаций, однако это все позволило нам примерно в 1800 раз ускорить исполнение код виртуальной машины и сборщика мусора на примере s4g.

Все зависит от конкретных случаев, ситуации, а также степени критичности. Однако наша экономия времени исполнения за счет ухудшения архитектуры вышла нам дорого, в итоге мы отказались от такого улучшения в пользу архитектуры, и не прогадали))

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*