Вопросы по MQL4 - страница 12

 
вопрос только в том, будет ли работать заметно быстрее, если обработку массивов вынести в DLL?
у кого проинсталирован компилятор какой-нибудь? проверьте пожалуйста! не уж то настолько влом?


обращение к массиву работает раз в десять медленнее чем к локальным переменным.


Время обращения к элементу массива НЕ ВСЕГДА больше, чем время обращения к переменной.
Конкретные цифры будут различны для разных компиляторов, но тенденция должна сохраниться.

Компилятор - Visual Studio 2005. Процессор - Athlon XP 2500+.
Время исполнения, вместе с инициализацией массивов - 1,06-1,07 с.
Dim t1, t2 As Double
t1 = DateAndTime.Timer()
Dim x, y, z As Double
Dim d, k As Double
Dim Open(5001), Close(5001) As Double
For d = 5000 To 1 Step -1
	For k = 1 To 4999
		z = Close(k) : y = Close(k + 1) : x = Close(k + 2)
		z = Open(k) : y = Open(k + 1) : x = Open(k + 2)
	Next
Next
t2 = DateAndTime.Timer()
MsgBox(CStr(t2 - t1) + " seconds")



Тот же цикл, но с

z = Close(1) : y = Close(1) : x = Close(1)
z = Open(1) : y = Open(1) : x = Open(1)


дает 0,37-0,4 с.

И, наконец,

z = k : y = k : x = k
z = k : y = k : x = k


0,56-0,6 с.

На основании этого хочу сделать следующий вывод:
главное - не компилятор и не "массив/не массив", главное - правильное структурирование данных и правильный код!
P.S. Разумеется все приведенные тезисы, кроме замеров времени, - мое личное, глубоко субъективное и скромное мнение, просто как программиста.

 
спасибо!

да, всё-таки оптимизация результирующего кода в компиляторе - это сила..
не хочется залезать в дебри, но похоже, что копилятор visual studio сам оптимизирует обращения к массивам.
для честности теста надо ввести переменную, скажем, S; и вставить между всеми присваиваниями x,y,z что-то типа S=S+x, S=S+y, S=S+z, а в конце вывести кроме времени ещё и S. чтоб получить "чистую" скорость.

хотя оптимизатор компилятора может и этот обман частично раскусить.. :)
 
для честности теста надо ввести переменную


Я уже давно отбросил такие мысли. И даже делал проверки. И пришел к выводу:

Компилятор выполняет все предписанные операции, да и просто не имеет права не выполнять их, т.к. просто невозможно на 100% знать, откуда я планирую получать доступ к этим переменным - в этом же методе, из какого-нибудь таймера (и структурно не связанного кода) или вообще из другого процесса.
Так что, все по честному. Проверено.

P.S. Оффтопик, сорри. Не сдержался.
 
по поводу обращений к массивам..
что в итоге из себя представляет массив, указанный параметром в ArrayCopySeries?

это обычный массив значений, или массив указателей на значения?

(вопрос, очевидно, глупый, но я лет 10 не программировал, тем более на C, тем более под Windows.)

и где про всё это почитать?
 
Существует ли какой-нибудь способ определить состояние кнопки включения советника в период между тиками?
Очень нужно..

Может хоть.. Не знаю. Допускается ли рекурсивное обращение к start()?
 
так разве деинит() не запускается при выключении кнопки?
 
Существует ли какой-нибудь способ определить состояние кнопки включения советника в период между тиками?

способа нет. эксперт не запустится, если кнопка выключена.

Допускается ли рекурсивное обращение к start()?

допускается.
 
Slawa,
Спасибо за ответ.


Ну. И что теперь..?
Не знаю.. или пойти по 5, но вчера.. а сегодня по 3.. маленькие.

Придётся соглашаться на много маленьких. Не хотелось. Ну, да что ж теперь..:(
Казалось бы так просто..

(не обращайте внимания, это медитация уже через край на клавиатуру плещется)
 
FirstVisibleBar() и BarsPerWindow() не выделяются цветом в МЕ.
Это у меня в глазах рябит или так и должно быть?
 
FirstVisibleBar() и BarsPerWindow() не выделяются цветом в МЕ.
Это у меня в глазах рябит или так и должно быть?

Выделяются и выделялись всегда нормально. Только что проверил 183 билд и 187.
Причина обращения: