Vasiliy Sokolov: Сдвигать массивы нельзя, на то они и массивы. Для экономного использования процессорного времени, Вы должны научится пользоваться классами, в частности списком CList, где добавление нового элемента происходит практически мгновенно. Если Вам также важен быстрый доступ по индексу, советую присмотреться в сторону CDictionary. В нем в качестве ключа можно указать сам индекс, при этом доступ к элементу будет таким же быстрым, как в массиве, а добавление нового элемента - таким же быстрым как в CList.
Спасибо!
Посмотрел CList Add - Добавляет элемент в конец списка, а мне нужно в начало (arr[0] или arr[0][0][0] для многомерного массива), со смещением всех остальных значений на 1 позицию назад.
без ArraySetAsSeries, - работает.
Сделал сравнение по времени с полным перебором в цикле массива [1000000][10][2] - оказалось цикл быстрее на 10 - 20%
ArrayCopy можно применить разве что из соображения простоты кода, - 1 команда, вместо нескольких для цикла.
Отдавая предпочтение скорости, оставил цикл.
Vasiliy Sokolov: Кстати это самое быстрое решение какое может быть. На практике реализовать его не так просто, т.к. придется закопаться в индексную арифметику.
Dmitry Fedoseev: Одно арифметическое действие. Будет значительно быстрее, чем сдвигать.
оно одно, на надо делать на каждом тике. Хотя и массив надо 1 раз но много элементов сдвинуть)) Возможно получится фифти / фифти оба варианта при равном времени вычислений
оно одно, на надо делать на каждом тике. Хотя и массив надо 1 раз но много элементов сдвинуть)) Возможно получится фифти / фифти оба варианта при равном времени вычислений
Но в текущем проекте, весь код уже ведет счет от 0 и далее сложением, теперь надо все переделывать на индекс вместо 0 и вычитание. Еще один минус - размеры массива будут разрастаться по полмиллиона минутных баров в год. Впрочем для ОЗУ на 8 Гг это мелочи))
Надо будет подумать о переделке...
Спасибо!
Кольцевой вариант тоже хорош, т.к. размеры массива не будут разрастаться, но в нем надо каждый раз сравнивать индекс с размером массива, и при превышении - вычитать его из индекса.
Хотя в моем случае возможно индекс вместо 0 будет сложно внедрить, т.к. тот массив вычисляется из других, которые получаются копированием CopyClose и индикаторов, а все они счет ведут от 0.
Боюсь, что количество вычислений все таки сильно возрастет. Да и понимание сути программы усложнится. А это тоже важный момент. Видимо все таки придется оставить смещение массива в цикле от 0.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
если считать ваш массив кольцевым буфером, то индекс высчитывается через модуль по размеру - и ненадо ничего наместе копировать
Сдвигать массивы нельзя, на то они и массивы. Для экономного использования процессорного времени, Вы должны научится пользоваться классами, в частности списком CList, где добавление нового элемента происходит практически мгновенно. Если Вам также важен быстрый доступ по индексу, советую присмотреться в сторону CDictionary. В нем в качестве ключа можно указать сам индекс, при этом доступ к элементу будет таким же быстрым, как в массиве, а добавление нового элемента - таким же быстрым как в CList.
Спасибо!
Посмотрел CList Add - Добавляет элемент в конец списка, а мне нужно в начало (arr[0] или arr[0][0][0] для многомерного массива), со смещением всех остальных значений на 1 позицию назад.
Просто вычислять индекс. Новые элементы добавлять в конец, а чтобы обращаться к индексу 0, вычислять - количество минус 1 и минус 0.
Каждый раз (возможно на каждом тике) при считывании значения вычислять индекс, это наверное дольше, чем 1 раз сместить все на новом баре
То же самое отностся и к кольцевому индексу(
Кстати это самое быстрое решение какое может быть. На практике реализовать его не так просто, т.к. придется закопаться в индексную арифметику.
Каждый раз (возможно на каждом тике) при считывании значения вычислять индекс, это наверное дольше, чем 1 раз сместить все на новом баре
Одно арифметическое действие. Будет значительно быстрее, чем сдвигать.
оно одно, на надо делать на каждом тике. Хотя и массив надо 1 раз но много элементов сдвинуть)) Возможно получится фифти / фифти оба варианта при равном времени вычислений
оно одно, на надо делать на каждом тике. Хотя и массив надо 1 раз но много элементов сдвинуть)) Возможно получится фифти / фифти оба варианта при равном времени вычислений
Нет. Не верите, попробуйте.
Вы правы!
Но в текущем проекте, весь код уже ведет счет от 0 и далее сложением, теперь надо все переделывать на индекс вместо 0 и вычитание. Еще один минус - размеры массива будут разрастаться по полмиллиона минутных баров в год. Впрочем для ОЗУ на 8 Гг это мелочи))
Надо будет подумать о переделке...
Спасибо!
Кольцевой вариант тоже хорош, т.к. размеры массива не будут разрастаться, но в нем надо каждый раз сравнивать индекс с размером массива, и при превышении - вычитать его из индекса.
Нет. Не верите, попробуйте.
Хотя в моем случае возможно индекс вместо 0 будет сложно внедрить, т.к. тот массив вычисляется из других, которые получаются копированием CopyClose и индикаторов, а все они счет ведут от 0.
Боюсь, что количество вычислений все таки сильно возрастет. Да и понимание сути программы усложнится. А это тоже важный момент. Видимо все таки придется оставить смещение массива в цикле от 0.