Скачать MetaTrader 5

Что быстрее? глобальные или локальные переменные?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй свой счет через платежную систему Visa QIWI Wallet
elibrarius
1759
elibrarius 2013.11.12 10:50 

Здравствуйте,

вопрос к разработчикам самого Metаtrader  или разработчикам советников с большим опытом.

При оптимизации советников большое значение имеет скорость работы функций.

1) Какие переменные лучше использовать в них, глобальные или локальные?

2) Читал по языку Си, что локальные переменные хранятся в регистрах процессора, следовательно работа с ними быстрее. Так ли это в Metаtrader 4 и 5?

3) Понятно, что без глобальных переменных не обойтись, например в функции глобальная переменная используется 10 раз (арифм. операции, сравнение и т.п.). Лучше ли будет скопировать 1 раз ее в локальную, и далее 10 раз воспользоваться уже локальной переменной?

4) Еще не ясно, с массивами, где-то читал, что работа с ними медленнее, чем с несколькими переменными. Так ли это?

5) константы глобального уровня и переменные глобального уровня, равны по скорости?

------ Полученные ответы из обсуждения ---------------

1) глобальные быстрее (оказывают заметное влияние, если количество операций с ними - несколько тысяч. Если единицы, как в большинстве советников, то влияние - ничтожное.)

3) нет

4) если массив динамический и приходится постоянно пополнять его, то его переразмер занимает много времени. Лучше использовать массивы с заранее определенным размером.

Vasiliy Sokolov
21696
Vasiliy Sokolov 2013.11.12 11:42  
elibrarius:

Здравствуйте,

вопрос к разработчикам с большим опытом или к разработчикам.

При оптимизации советников большое значение имеет скорость работы функций.

1) Какие переменные лучше использовать в них, глобальные или локальные?

2) Читал по языку Си, что локальные переменные хранятся в регистрах процессора, следовательно работа с ними быстрее. Так ли это в Metаtrader 4 и 5?

3) Понятно, что без глобальных переменных не обойтись, например в функции глобальная переменная используется 10 раз (арифм. операции, сравнение и т.п.). Лучше ли будет скопировать 1 раз ее в локальную, и далее 10 раз воспользоваться уже локальной переменной?

4) Еще не ясно, с массивами, где-то читал, что они очень медленные в работе. Так ли это?

2. Спецификация языка Си не определяет положение локальных переменных в регистрах. Тем более регистров процессора все равно на все переменные не хватит. В Си есть ключевое слово 'register', но и оно не подразумевает, что переменная должна разместиться в одном из регистров процессора. Это слово просто дает компилятору указание, что необходимо попытаться прооптимизировать работу с ней особенно тчательно.

4. Нет, не так. Массивы предоставляют самый быстрый способ работы с группированными данными. К каждому элементу можно обратиться напрямую, используя его индекс (адресную арифметику по сути). Но у массивов есть существенный недостаток: операции по вставке/изменению размера очень, очень ресурсоемки. Так, если вы накапливаете данные в массив и знаете, что в конце работы программы величина этих данных не превысит 1 000 000 элементов, то лучше сразу выделить все необходимую память, чем поэлементно вставлять новые значения в массив. Такая поэлементная вставка будет раз за разом переразмечать емкость массива, что снизит производительность на порядок.  Этот тип данных представлен в стандартной библиотеки классами CArray 

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

Есть еще один тип организации данных: словарь или хеш. Он представляет из себя некое хранилище данных, к каждому элементу которого можно обратиться указав вместо индекса сам объект к которому требуется доступ. Например Hash["Коля","Петя","Вася","Саша","Катя"]; sting my_name = Hash["Вася"]; Hash очень быстро найден значение "Вася" и вернет его переменной my_name. Его организация напоминает что-то среднее между списком и массивом, а по производительности он скорее близок к массивам, хотя и уступает им в скорости. К сожалению в стандартной библиотеке этот тип данных не представлен. 

Основных видов памяти в компьютере два: это Стек и Куча. Стек считается более быстрым чем куча. В нем размещаются локальные переменные. В куче размещаются динамические объекты. В целом очень многое зависит от языка программирования. Как сделано конкретно в MQL5 могут ответить только разработчики. В C# например, в стеке размещаются значимые типы: int, double, byte, struct... а в куче ссылочные, т.е. все объекты типа class. В С++ такого жесткого разделения нет. Где и как будет размещаться объект определяет компилятор.

По сабжу: как разработчик Вы должны оптимизировать приложение в зависимости от его задачи. Так например, если Вы активно формируете некоторый массив данных, вставляете и сортируете элементы внутри него, то Вы должны  сознательно выбрать в качестве хранилища данных более медленный CList, потому что применительно к Вашей задаче он будет гораздо более эффективней чем более быстрый CArray и т.д.

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

GaryKa
494
GaryKa 2013.11.12 12:50  
C-4:

Есть еще один тип организации данных: словарь или хеш. Он представляет из себя некое хранилище данных, к каждому элементу которого можно обратиться указав вместо индекса сам объект к которому требуется доступ. Например Hash["Коля","Петя","Вася","Саша","Катя"]; sting my_name = Hash["Вася"]; Hash очень быстро найден значение "Вася" и вернет его переменной my_name. Его организация напоминает что-то среднее между списком и массивом, а по производительности он скорее близок к массивам, хотя и уступает им в скорости. К сожалению в стандартной библиотеке этот тип данных не представлен.

Чуть подправлю: словарь (как я понимаю в данном случае это ассоциативный массив) это скорее абстракция / интерфейс для работы с таким типом данных. Хеш (как я понимаю в данном случае это хеш-таблица) это уже реализация/имплементация этой структуры данных, в основе которой работа хеш-функцией. По большому счету ассоциативный массив можно реализовать и через другие структуры данных. Просто реализация через хеш-таблицу  в большинстве случаев оптимальна по времени по многим операциям.

Действительно очень странно что в стандартной библиотеке этого нет. A перечисления (enumeration) есть?

Ассоциативный массив — Википедия
  • ru.wikipedia.org
Ассоциативный массив (словарь) — абстрактный тип данных (интерфейс к хранилищу данных), позволяющий хранить пары вида «(ключ, значение)» и поддерживающий операции добавления пары, а также поиска и удаления пары по ключу: Предполагается, что ассоциативный массив не может хранить две пары с одинаковыми ключами. В паре значение называется...
Roffild
1347
Roffild 2013.11.12 12:51  
"Преждевременная оптимизация — это корень всех бед" (c) Дональд Кнут

Сначала нормальный код, а потом профайлером по нему.
Alexander Laur
7691
Alexander Laur 2013.11.12 13:07  
C-4: 

 Жалко, что нет кнопочки "Данный ответ был полезен для меня". С удовольствием бы ее кликнул.

Не понятна упертость МК по отношению к такому сервису. Редко, когда на данном форуме встречаются такие обстоятельные ответы.

С-4, Спасибо за ответ!!! 

Комбинатор
15920
Комбинатор 2013.11.12 13:10  
Roffild:
Сначала нормальный код, а потом профайлером по нему.
Яро плюсую.
Комбинатор
15920
Комбинатор 2013.11.12 13:12  
C-4:

Есть еще один тип организации данных: словарь или хеш. Он представляет из себя некое хранилище данных, к каждому элементу которого можно обратиться указав вместо индекса сам объект к которому требуется доступ. Например Hash["Коля","Петя","Вася","Саша","Катя"]; sting my_name = Hash["Вася"]; Hash очень быстро найден значение "Вася" и вернет его переменной my_name. Его организация напоминает что-то среднее между списком и массивом, а по производительности он скорее близок к массивам, хотя и уступает им в скорости. К сожалению в стандартной библиотеке этот тип данных не представлен.

Не ну вот зачем писать то в чем я так понимаю ниже планки нуля? Словарь и хеш-карта это две абсолютно разных сущности. В С++ есть map и hashmap.
Vasiliy Sokolov
21696
Vasiliy Sokolov 2013.11.12 13:35  
TheXpert:
Не ну вот зачем писать то в чем я так понимаю ниже планки нуля? Словарь и хеш-карта это две абсолютно разных сущности. В С++ есть map и hashmap.
Словарь можно реализовать на основе хеша, а можно и другим методом. Но если делать все по-взрослому, то хеширующая функция в словаре по-любому понадобиться, ибо как иначе ты сможешь гарантировать уникальность объекта и его эффективную сортировку? А вообще чрезмерно умничать не стоит. Конечному пользователю (т.е. нам программистам) не важна фактическая реализация алгоритма, а важны лишь те свойства, которые он дает.
Комбинатор
15920
Комбинатор 2013.11.12 13:38  
C-4:

В подавляющем большинстве случаев хватает мапы, которая реализована r-b деревом.

Я не умничаю чрезмерно, я другим не даю этого делать.

Vasiliy Sokolov
21696
Vasiliy Sokolov 2013.11.12 14:06  
TheXpert:

В подавляющем большинстве случаев хватает мапы, которая реализована r-b деревом.

Я не умничаю чрезмерно, я другим не даю этого делать.

Да нет, умничаешь и зафлуживаешь ветку здесь ты. Реализаций словаря может быть несколько. Но я написал только о той, что известна лично мне. Я не работаю с С++ и не знаю что такое "мапы", но знаю что в C# стандартный Dictionary реализован на основе хеш-таблицы поэтому мое сравнение с хештаблицей предельно корректно. Словарь в .Net содержит пару "ключ - значение", где уникальность ключа гарантирует хеш функция. Хеш таблица содержит только уникальные объекты, уникальность которых гарантируется той же хеш функцией. Сама хеш функция в развитых средах может быть переопределена наследником. Так в C# поведение хеш функции различно в зависимости от того, имеем ли мы дело с ссылочным или значимым типом...

В общем "умничать" можно до бесконечности, но прежде чем спорить почитай что умные люди пишут о внутренней реализации словаря: Под капотом у Dictionary и ConcurrentDictionary. Кстати данный материал будет весьма интересен всем кто интересуется работой хеш алгоритмов и словарей. 

Под капотом у Dictionary и ConcurrentDictionary
Под капотом у Dictionary и ConcurrentDictionary
  • habrahabr.ru
Некоторое время назад, я решил, что хочу знать больше подробностей о работе многопоточности в .NET и что я уделял этому незаслуженно мало внимания в прошлом. Информации на эту тему великое множество (отправной точкой я для себя выбрал этот раздел книги «C# in a nutshell»), но, как оказалось, только малая часть ресурсов пытаются объяснить что-то...
Комбинатор
15920
Комбинатор 2013.11.12 14:20  
C-4:

Перечитал, приношу извинения. У меня таки выражение стандартная библиотека никак не ассоциируется со здешней стандартной. Автоматом подумал на STL отсюда и непонятки.

А шарповский dictionary как раз на hashmap и сделан. И если пишешь про dictionary, то и пиши про него и c#, а не про словарь и вообще.

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий