Germany | Finland | Saint Petersburg | Drive

Увеличение производительности Амиброкера

Опубликовано в FAQ AmiBroker

Увеличение производительностиВопросы производительности Амиброкера. Что делать, если оптимизация длится слишком долго?

На мой взгляд AmiBroker является самой быстрой программой технического анализа. Однако существуют способы значительно уменьшить Wink ее производительность. Здесь я попробую описать эти способы.  Таковыми могут быть  как  неправильные настройки так  и плохое кодирование формулы. Понимание этих моментов позволит ускорить работу Амиброкера, особенно в критичных с точки зрения затрат времени режимах.

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

  1. Операционная
  2. Настройки AmiBroker
  3. Формула кодирования

 

Операционный уровень

Не стоит использовать всяческие утилиты типа «турбоускорителей памяти», «оптимизаторов Windows» и прочих. Они создают большую нагрузку на процессор и системные ресурсы, при этом  обеспечивают  нулевую или практически нулевую выгоду. Замечу, что Амиброкер – это вычислительная задача и производительность процессора здесь имеет решающее значение – не стоит его тратить на второстепенные задачи.

Особенно сильно влияют на производительность Амиброкера антивирусы с  так называемой "живой" защитой всех файлов на всех дисках. Это приводит к резкому снижению производительности всей системы. Причина? Антивирус перехватывает каждый доступ к файлам и запускает свои сложные и требовательные к ресурсам процессора  проверки по каждому доступу к данным. В своё время мне даже пришлось сменить программу антивируса. Та версия Касперского, что была установлена у меня,  возомнила себя кортежем, летящим по Кутузовскому проспекту.

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

 

Уровень настроек Амиброкера

Следует применять осмысленный подход к выбору максимального количества свечей в базе данных. Больше свечей – требуется больше памяти и больше расчетов. Например, база, содержащая 50 000 дневных свечей, не имеет смысла – это 192 года. Каждый бар данных составляет 40 байт. Так что, если вы вводите 100000 баров, вы заставите AmiBroker реально выделить 4 Мб памяти * на символ *. Вроде бы немного, но AmiBroker сохраняет в кэше часто используемые данные. Если Вы задали, что кэш составляет 500 символов,  расход оперативной памяти составит  2 Гб. На большинстве компьютеров для сохранения этого кэша потребуются файловые операции свопинга с диском.  Узнать количество свечей для символа можно пункте меню Файл-> Параметры базы.

Последствия касаются не только памяти, но и в скорости. Обработка свечей  займет также больше времени, особенно учитывая факт наличия  встроенного сверхскоростного кэша в современных процессорах. Небольшие объемы данных, требующие многократного доступа, могут быть сохранены в  кэше чипа  процессора. Учитывая, что доступ к содержимому кэша процессора в 10 (и более) раз быстрее, чем обычная память, становится очевидно , что  указание слишком большого количества свечей привести к падению производительности. Опять же: один бар составляет 40 байт. Максимальная производительность будет достигнута, если все данные по символу помещаются в кэше чипа. Итого:  если ваш процессор имеет 4 Мб кэш-памяти для достижения оптимальной производительности желательно не использовать более 100000 баров в Файл-> Настройка базы данных.

 

Уменьшить размер кэш в памяти, если Вы используете очень большие базы данных (размер диска > 2 Гб)

 

Размер кэша Амиброкера устанавливается в Инструменты-> Настройки "Data". Вкладка определяет количество символов в кэш-памяти и максимальный объём используемой памяти. Кэш Амиброкера обычно ускоряет обработку данных, потому что не нужно читать и записывать данные на диск. В случае слишком большого кэша свободной оперативной памяти может не хватать на остальные нужды. В этом случае относительно медленные операции свопинга неизбежны. Для 32-разрядных операционных систем кроме того действует ограничение доступной виртуальной памяти 2 Гб. Для того чтобы избежать нехватки памяти, перейдите в меню Сервис-> Настройки "Data" и уменьшить размер кэш в памяти.

 

Уровень кодирования формулы

 

Стиль кодирования сильно влияет на производительность. Люди, начинающие кодировать, основываясь на принципах других языков, зачастую не в полной мере могут реализовать потенциал языка AFL. Как правило, они пишут обработки массивов в привычном им виде – циклами. Такой стиль программирования приводит к результату. Тем не менее, обычно циклы могут быть 10 .. 50 раз медленнее, чем использование «родных» возможностей. . Таким образом, для лучшей скорости следует избегать циклы вообще и заменить их обработкой массивов, или, по крайней мере, сделать код цикла максимально коротким.

 

Рассмотрим следующий код:

 

SetBarsRequired( sbrAll );

GetPerformanceCounter(1);

for( i = 0; i<BarCount; i++)

{

    med[ i ] = (H[ i ] + L[ i ])/2;

}

"Loop time: "+GetPerformanceCounter(1);

med = ( H + L )/2;

"Array time: "+GetPerformanceCounter(1);

При выполнении этого кода на 350 000 свечах цикл занимает 100 миллисекунд (0.1сек)  и только 2 мс (0.002сек) при использовании встроенной функции массива. Таким образом, код с использованием встроенных операторов обработки массивов в 50 раз быстрее цикла.

Таким образом, существует несколько рекомендаций для AFL кодирования:

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

Все операции с массивами должны быть вынесены из цикла. Следует избегать использования циклов повторно.

 

 Рассмотрим следующий код:

 

for( i = 0; i < BarCount; i++ )

 {    x = MA( C, 10) ;  / / НЕВЕРНО!  Функция называется снова и снова! Она должна быть вне цикла   

       y[ i ] = C[ i ]/x[ i ];

 }

 

Проблема придедённого кода сстоит в повторении одного и того же расчета скользящей средней BarCount раз. Вычисление скользящей средней не зависит от счетчика цикла и остальных вычислений в цикле (является инвариантой), потому он может быть вычислен один раз и должен быть перемещен за пределы (до) цикла следующим образом:

 

x = MA( C, 10 );      / / ПРАВИЛЬНО!  Инварианта цикла находится за его пределами

for( i = 0; i < BarCount; i++ )

 {

    y[ i ] = C[ i ]/x[ i ];

 }

В редакторе редактор формул AFL меню Сервис-> Проверка кода позволяют выяснить, какие функции вызываются, сколько раз и какие из них исполняются дольше остальных. Очевидно, что оптимизация наиболее часто вызываемых функций дает основной выигрыш.  

Если вам нужно сохранить массив данных в одной формуле и читать его в другой, и использовались AddToComposite/Foreign, имеет смысл рассмотреть возможность использования массивов статических переменных (StaticVarGet / StaticVarSet). Статические переменные работают быстрее. Обратите внимание, что время жизни статической переменной ограничивается временем работы программы, в то время  как тикеры AddToComposite являются постоянными.

 

Чтобы помочь в режиме реального времени отслеживать выполнения программы, AmiBroker предоставляет два инструмента. Первый - окно системного монитора, второй – индикатор производительности, который находится справа в строке состояния AmiBroker.

 

 Индикатор производительности показывает:

  • для баз, работающих в реальном времени процент загрузки
  • для офф-лайн баз данных: размер свободной виртуальной памяти

 

Коэффициент загрузки уазывается в процентах, который показывает относительную "загруженность" программы. Коэффициент нагрузки рассчитывается как

(время обновления графиков  в миллисекундах) / 2 + (время доступа к данным в миллисекундах) / 2 + (свободная виртуальная память ниже 20% от общей памяти). Таким образом, он достигнет 100% в любой из ситуаций, перечисленных ниже:

  • общий график обновления времени больше, чем 200 мс
  • общий доступ к данным момент выше, чем 200 мс
  • свободной виртуальной памяти падает ниже 10% от общей памяти (или сочетание этих факторов)

 

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

 

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

Рекомендуется сохранить коэффициент загрузки ниже 100%. Если коэффициент загрузки 100%, AmiBroker может постоянно обновлять все графики в режиме реального времени (чаще 5 раз в секунду) и обеспечивать быстрый отклик на действия пользователя. При нагрузке в 200% Amibroker все еще в состоянии обновлять все графики с частотой 2,5 раза в секунду, но реакция интерфейса может быть замедлена. 200% является максимальным значением, которое позволяет более или менее нормально работать с программой.

 

Когда коэффициент нагрузки поднимается выше 100%, появляется информационная подсказка о причине низкой производительности. При коэффициенте нагрузки выше 300% подсказка будет появляться каждую минуту.

 

AmiBroker будет продолжать работать с нагрузкой даже более 1000%, однако производительность будет низкая (одно обновление каждые 5 секунд и более).

 

Обычно Амиброкер в режиме он-лайн обновляет графики с фиксированной частотой. При установке эта частота задана в 3 секунды. В случае, если Амиброкер используется в качестве основы для принятия решений торговым автоматом в реальном времени, может потребовться требуется максимально быстрое обновление графиков. В случае, если Текущая  наруженность Амиброкера низка, можно включить параметр Tools-Preferences-intraday-realtime chart refresh в НОЛЬ. В этом случае Амиброкер будет работать насколько это возможно быстро, перерисовывая график по факту получения каждой новой сделки. При этом он будет также перерасчитывать формулу. В случае, если ресурсов оборудования на такое поведения недостаточно, Амиброкер будет использовать максимально возможную частоту обновления при условии, что загрузка процессора не будет превышать 50%.

Комментарии   
# Александр 2 24.04.2018 05:47
Здравствуйте . Какой ноутбук идёт под AMI ? характеристики.
Ответить | Ответить с цитатой | Цитировать
# admin 24.04.2018 06:00
Здравствуйте.


В общем случае будет работать на любом. Чем мощнее процессор, тем быстрее будет Ами на нем работать.

Не нетбуке с двухядерным атомом и гигабайтом памяти работает, но зрелище грустное. На i5 летает.
Ответить | Ответить с цитатой | Цитировать
# Александр 2 24.04.2018 09:59
Спасибо.
Ответить | Ответить с цитатой | Цитировать
Добавить комментарий