Обновление массива Rates с каждым новым баров. Или как добавить в массив только последний бар. - страница 2
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Не придирайтесь к словам. Смена порядка индексации это и есть переворачивание массива
ArrayResize(), тем более на 1 элемент, крайне длительная операция, вы в основном его замеряли :-) Чтобы было шустро надо резервировать память, то есть использовать 3-й параметр
И смена порядка индексации - это всё-тами просто инверсия флага.
да ещё никто отчего-то не проверил корректность полученных данных :-) но это традиция
Максим, я взял то, что было предложено из учебника. И прекрасно понимаю, что в учебнике не самые оптимальные решения…
Мой посыл был направлен ТС для того, чтобы он обратил внимание на скорость копирования всей истории. И обратите внимание на то, что замер был в микросекундах. А в миллисекундах был 0…
ps; И пока не удалил код добавил в строку изменения размера массива
Время сократилось почти в 3 раза
но ни в какое сравнение не идёт с копированием всей истории.
Максим, я взял то, что было предложено из учебника. И прекрасно понимаю, что в учебнике не самые оптимальные решения…
Мой посыл был направлен ТС для того, чтобы он обратил внимание на скорость копирования всей истории. И обратите внимание на то, что замер был в микросекундах. А в миллисекундах был 0…
ps; И пока не удалил код добавил в строку изменения размера массива
Время сократилось почти в 3 раза
но ни в какое сравнение не идёт с копированием всей истории.
вывод неверный.
если вынести ArrayResize из второго цикла наружу - будут примерно похожие показания.
Вы измерили ArrayResize (это функция катастрофа), а результат интерпретируете к CopyRates
PS когда важна скорость, то заранее делать все массивы, чтобы как можно меньше обращаться к ArrayResize. Тогда можно обойтись без микрооптимизаций в стиле fxsaber (не натягивать наносекунды жертвуя читабельностью) ;-)
вывод неверный.
если вынести ArrayResize из второго цикла наружу - будут примерно похожие показания.
Вы измерили ArrayResize (это функция катастрофа), а результат интерпретируете к CopyRates
PS когда важна скорость, то заранее делать все массивы, чтобы как можно меньше обращаться к ArrayResize. Тогда можно обойтись без микрооптимизаций в стиле fxsaber (не натягивать наносекунды жертвуя читабельностью) ;-)
Согласен. Не сильно вникал и напрягал мозги.
Но результат неутешительный
Согласен. Не сильно вникал и напрягал мозги.
Но результат неутешительный
Вы что-то совсем не то между собой сравниваете. Вызывать в цикле копирование по одному бару - это полный идиотизм.
Напомню, что Было предложено вместо копирования всего массива котировок брать только свежие, как правило, один свежий бар (без всякого цикла).
Поэтому в замерах скорости нужно из второй части теста делить время на количество баров (будет ведь делаться только один запрос). Итого 716/5480 = 0.13, существенно лучше, чем ваши 36.
Вы что-то совсем не то между собой сравниваете. Вызывать в цикле копирование по одному бару - это полный идиотизм.
Напомню, что Было предложено вместо копирования всего массива котировок брать только свежие, как правило, один свежий бар (без всякого цикла).
Поэтому в замерах скорости нужно из второй части теста делить время на количество баров (будет ведь делаться только один запрос). Итого 716/5480 = 0.13, существенно лучше, чем ваши 36.
Совершенно верно. Возьмите одну итерацию цикла и полу́чите то, о чём вы говорите. Я сделал такие циклы, чтобы можно было сделать замер скорости выполнения не одной итерации, а многих…
В первом цикле было выполнено 5480 раз копирование всей истории, а во втором цикле 5480 раз по одному бару. И обратите внимание, на вопрос ТС и даже название темы
«Обновление массива Rates с каждым новым баров. Или как добавить в массив только последний бар.»
Поэтому если 36/5480 будет гораздо меньше чем 0,13… Почти в 20 раз.
Может вы не видели на первой странице весь код? Так мне не сложно повторить
Совершенно верно. Возьмите одну итерацию цикла и полу́чите то, о чём вы говорите. Я сделал такие циклы, чтобы можно было сделать замер скорости выполнения не одной итерации, а многих…
В первом цикле было выполнено 5480 раз копирование всей истории, а во втором цикле 5480 раз по одному бару. И обратите внимание, на вопрос ТС и даже название темы
«Обновление массива Rates с каждым новым баров. Или как добавить в массив только последний бар.»
Поэтому если 36/5480 будет гораздо меньше чем 0,13… Почти в 20 раз.
Может вы не видели на первой странице весь код? Так мне не сложно повторить
У вас оптимизация компиляции включена наверно? Тогда ваш первый цикл и вызов функции выполняется только 1 раз.
И красным и жирным шрифтом вы что хотели выделить? Я ответил именно на этот вопрос автора темы.У вас оптимизация компиляции включена наверно? Тогда ваш первый цикл и вызов функции выполняется только 1 раз.
И красным и жирным шрифтом вы что хотели выделить? Я ответил именно на этот вопрос автора темы.Не сильно изменилось.
Что касается выделенного красным: ТС хочет иметь всю историю для пересчёта на каждом баре. По этому ему нужен не только последний бар, а вся история. Или как минимум не один десяток баров. Вот и получается, либо на каждом баре копировать всю историю, либо копировать один бар и дописывать его в другой массив.
У вас массивы p и r в локальной области.
С каждым событием Calculate, вы заново физически выделяете память. Более того, терминал ее физически освобождает потом (с каждым Calculate).
Резервирование памяти (с помощью третьего параметра ArrayResize) не работает в вашем коде совсем. У вас один вызов ArrayResize, который с каждым Calculate заново выделяет память.
Весь этот do while можно заменить одним вызовом CopyRates, избежав копирования всех баров, а скопировав только те, которые были добавлены.
Вы ведь вызываете Bars() внутри ArrayResize. То есть, вам уже известно актуальное количество баров на графике. А количество баров, которые вы уже скопировали в глобальный массив на предыдущем OnCalculate будет равняться размеру этого глобального массива.
У вас массивы p и r в локальной области.
С каждым событием Calculate, вы заново физически выделяете память. Более того, терминал ее физически освобождает потом (с каждым Calculate).
Резервирование памяти (с помощью третьего параметра ArrayResize) не работает в вашем коде совсем. У вас один вызов ArrayResize, который с каждым Calculate заново выделяет память.
Весь этот do while можно заменить одним вызовом CopyRates, избежав копирования всех баров, а скопировав только те, которые были добавлены.
Вы ведь вызываете Bars() внутри ArrayResize. То есть, вам уже известно актуальное количество баров на графике. А количество баров, которые вы уже скопировали в глобальный массив на предыдущем OnCalculate будет равняться размеру этого глобального массива.
Изучите сначала тему с первого сообщения.
О каком выделении и освобождении памяти вы говорите, если в этом ПРИМЕРЕ выполнение цикла происходит только ОДИН раз. ТОЛЬКО ОДИН!!!