Вопрос: сдвиг индексов в массивах при сдвиге индексов баров - страница 2

 
Maxim Kuznetsov:

если считать ваш массив кольцевым буфером, то индекс высчитывается через модуль по размеру - и ненадо ничего наместе копировать

Кстати это самое быстрое решение какое может быть. На практике реализовать его не так просто, т.к. придется закопаться в индексную арифметику.
 
Vasiliy Sokolov:
Сдвигать массивы нельзя, на то они и массивы. Для экономного использования процессорного времени, Вы должны научится пользоваться классами, в частности списком CList, где добавление нового элемента происходит практически мгновенно. Если Вам также важен быстрый доступ по индексу, советую присмотреться в сторону CDictionary. В нем в качестве ключа можно указать сам индекс, при этом доступ к элементу будет таким же быстрым, как в массиве, а добавление нового элемента - таким же быстрым как в CList.

Спасибо!

Посмотрел CList Add - Добавляет элемент в конец списка, а мне нужно в начало (arr[0] или arr[0][0][0] для многомерного массива), со смещением всех остальных значений на 1 позицию назад.

Попробовал 
ArrayCopy(buf, buf, ArrayRange(buf,1)*ArrayRange(buf,2), 0, WHOLE_ARRAY-1);
без ArraySetAsSeries, - работает. Сделал сравнение по времени с полным перебором в цикле массива [1000000][10][2] - оказалось цикл быстрее на 10 - 20% ArrayCopy можно применить разве что из соображения простоты кода, - 1 команда, вместо нескольких для цикла. Отдавая предпочтение скорости, оставил цикл.


 
Dmitry Fedoseev:
Просто вычислять индекс. Новые элементы добавлять в конец, а чтобы обращаться к индексу 0, вычислять - количество минус 1 и минус 0. 

Каждый раз (возможно на каждом тике) при считывании значения вычислять индекс, это наверное дольше, чем 1 раз сместить все на новом баре

То же самое отностся и к кольцевому индексу(

 
Vasiliy Sokolov:
Кстати это самое быстрое решение какое может быть. На практике реализовать его не так просто, т.к. придется закопаться в индексную арифметику.
Только кажется, что сложно. 
 
elibrarius:
Каждый раз (возможно на каждом тике) при считывании значения вычислять индекс, это наверное дольше, чем 1 раз сместить все на новом баре
Одно арифметическое действие. Будет значительно быстрее, чем сдвигать. Точнее два, еще 1 вычесть, но все равно. 
 
Еще. Массив желательно увеличивать не на каждом баре на 1, а изредка на 1000. Еще одну переменную выделить для используемого размера.
 
Dmitry Fedoseev:
Одно арифметическое действие. Будет значительно быстрее, чем сдвигать.

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

 
elibrarius:

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

Нет. Не верите, попробуйте. 
 
Dmitry Fedoseev:
Нет. Не верите, попробуйте. 

Вы правы!

Но в текущем проекте, весь код уже ведет счет от 0 и далее сложением, теперь надо все переделывать на индекс вместо 0 и вычитание. Еще один минус - размеры массива будут разрастаться по полмиллиона минутных баров в год. Впрочем для ОЗУ на 8 Гг это мелочи))

Надо будет подумать о переделке...

Спасибо!

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

 
Dmitry Fedoseev:
Нет. Не верите, попробуйте. 

Хотя в моем случае возможно индекс вместо 0 будет сложно внедрить, т.к. тот массив вычисляется из других, которые получаются копированием CopyClose и индикаторов, а все они счет ведут от 0.

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