Ошибки, баги, вопросы - страница 2165

 
Renat Fatkhullin:

Люди давно потеряли способность понимать результаты современных С++ компиляторов.

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

Взгляните еще раз на утрамбовку 8 корней в 4 ассемблерные команды и поймите, что вы не имеете шанса что-либо утверждать, требовать или аппелировать к своей логике. Оптимизаторы давно уже работают на запредельных уровнях, недоступных программистам.

Я прекрасно вижу ваши результаты сравнения с VS и я в восторге от этого.
Но вопрос остается открытым. 

Я извиняюсь за хаосных рабочий код, но речь идет только о этом участке кода и  о сравнении двух вариантов выполнения:

 if(arr)
        {  // расчет квадратных корней через массив значений SQRT[]
         D1=SQRT[((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y))];
         D2=SQRT[((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y))];
         D3=SQRT[((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y))];
         D4=SQRT[((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y))];
         D5=SQRT[((X5-X)*(X5-X)+(Y5-Y)*(Y5-Y))];
         D6=SQRT[((X6-X)*(X6-X)+(Y6-Y)*(Y6-Y))];
         D7=SQRT[((X7-X)*(X7-X)+(Y7-Y)*(Y7-Y))];
         D8=SQRT[((X8-X)*(X8-X)+(Y8-Y)*(Y8-Y))];
        }
 else // расчет квадратных корней через функцию кв. корня sqrt()
        {
         D1=(int)sqrt((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));
         D2=(int)sqrt((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
         D3=(int)sqrt((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));
         D4=(int)sqrt((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));
         D5=(int)sqrt((X5-X)*(X5-X)+(Y5-Y)*(Y5-Y));
         D6=(int)sqrt((X6-X)*(X6-X)+(Y6-Y)*(Y6-Y));
         D7=(int)sqrt((X7-X)*(X7-X)+(Y7-Y)*(Y7-Y));
         D8=(int)sqrt((X8-X)*(X8-X)+(Y8-Y)*(Y8-Y));
        }

Здесь нет мусора.

Вы сказали, что "Оптимизация доступа к динамическому массиву отличная, выше похвал."

Но ... см. мое предыдущее сообщение.

Как Вы объясните последний мой эксперимент?:

"Т.е. когда используем  массив SQRT размером 20 000, мы в выигрыше 15-20%, а когда размером 3 000 000, то проигрыш 200% при абсолютно одинаковой математике.

Выходит размер массива причина тормозов?"

 

Прочтите мой предыдущий ответ внимательно - он дописан с точным ответом.

Объясню ваши вопросы просто: вдумчиво прочтите пяток технических статей по устройству процессоров в плане производительности и факторов, влиящих на нее. Без этого нельзя вести обсуждение, так как вам нужно объяснять базовые вещи.

 
Renat Fatkhullin:

То, как компилятор разложил корни, является исскуством. А вы пытаетесь побить это массивами, даже не понимая простейшего ограничения - чтение из массива это уже провал. Идеальная регистровая работа и пакетное вычисление корней против ветвлений(штрафы) и лазанию в память с частыми промахами в кеш.

Вы задаете вопрос «почему на мелком буфере быстрее работает, а на большом оглушительно сливает» потому, что вообще не знаете о L1/L2/L3 кешах процессора. Попали в кеш - посчитали быстро. Не попали - ждите пару десятков циклов чтения данных из верхнего кеша или памяти.
Renat Fatkhullin:

Прочтите мой предыдущий ответ внимательно - он дописан с точным ответом.

Объясню ваши вопросы просто: вдумчиво прочтите пяток технических статей по устройству процессоров в плане производительности и факторов, влиящих на нее. Без этого нельзя вести обсуждение, так как вам нужно объяснять базовые вещи.

Ура!!!
Наконец-то!
Из Вас, Ренат, все клещами нужно вытягивать.

Теперь картина для меня проясняется. 

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

Но все же не зря я написал этот код - лабораторную крысу и поднял эту волну.

Итак для читающих этот топик программистов подытожу, что лично мне в результате этой волны удалось выяснить:

  • Функция sqrt() и, скорей всего еще многие другие элементарные функции, очень быстры и выполняются не на уровне компилятора, а процессора.
  • Компилятор MQL5 настолько силен в оптимизации математической логики, что легко уделывает современный компилятор VS C++. Что очень вдохновляет.
  • Целесообразно стараться не смешивать типы в ресурсоёмких задачах. Смешение типов приводит к снижению скорости расчета.
  • РАЗМЕР ИМЕЕТ ЗНАЧЕНИЕ! (имеется ввиду размер массива :)) благодаря особенностям работы многоуровнего кэша процессора и его ограниченного размера. И программистам будет не лишним следить за суммарным размером массивов и понимать, что использование больших массивов может существенно влиять на скорость расчетов. Насколько я понял, речь идёт об  относительно комфортной работе массивов суммарным  объемом не превышающем приблизительно 512 кБ, а это ~65000 элементов типа double или ~130000 типа int., 

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

Спасибо Всем!

 

как узнать нажата или отжата кнопка перекрестие?

можно отловить нажатие колесика мыши, но если мышь не используется как быть?

 
Alexandr Bryzgalov:

как узнать нажата или отжата кнопка перекрестие?

можно отловить нажатие колесика мыши, но если мышь не используется как быть?

Может при необходимости принудительно нажимать или отжимать её?

CHART_CROSSHAIR_TOOL

Включение/отключение доступа к инструменту "перекрестие" по нажатию средней клавиши мышки

bool  (значение по умолчанию true)

 
Alexey Viktorov:

Может при необходимости принудительно нажимать или отжимать её?

CHART_CROSSHAIR_TOOL

Включение/отключение доступа к инструменту "перекрестие" по нажатию средней клавиши мышки

bool  (значение по умолчанию true)

это насколько понял лишь доступ к инструменту, но не включение выключение.

 

т.е. если поставить значение false этому свойству, то при нажатии колесика перекрестия не будет видно на чарте,

но при этом, при нажатии кнопки перекрестие на панели инструментов перекрестие на графике появляется.

вопрос, мышью и кнопкой включаются два разных перекрестия? )

ЗЫ: и при нажатии Ctrl+F и отключенном свойстве CHART_CROSSHAIR_TOOL, перекрестие так же появляется.

интересно, что тогда оно отключает?
 

еще интересен момент

если включить перекрестие кнопкой на панели задач, а отключить Ctrl+F, то оно не отключается )

 
Alexandr Bryzgalov:

еще интересен момент

если включить перекрестие кнопкой на панели задач, а отключить Ctrl+F, то оно не отключается )

Перекрестие не отключается ничем. Включив кнопкой, даже кнопкой не отключается. Включив Ctrl+F так-же не отключается ни Ctrl+F, ни кнопкой. Оно отключается после использования, то-есть нажатием мышки на графике.

 

Брокер "Открытие", почему такие (11 секунд) задержки по исполнению при сильных движениях?

2018.03.14 10:01:29.516 Trades  '289': exchange sell 10.00 Si-3.18 at market
2018.03.14 10:01:40.680 Trades  '289': accepted exchange sell 10.00 Si-3.18 at market
2018.03.14 10:01:40.692 Trades  '289': exchange sell 10.00 Si-3.18 at market placed for execution
2018.03.14 10:01:40.781 Trades  '289': order #85223736 sell 10.00 / 10.00 Si-3.18 at market done in 11265.537 ms
2018.03.14 10:01:40.782 Trades  '289': deal #47039430 sell 3.00 Si-3.18 at 57027 done (based on order #85223736)
2018.03.14 10:01:40.786 Trades  '289': deal #47039431 sell 2.00 Si-3.18 at 57026 done (based on order #85223736)
2018.03.14 10:01:40.787 Trades  '289': deal #47039432 sell 3.00 Si-3.18 at 57026 done (based on order #85223736)
2018.03.14 10:01:40.790 Trades  '289': deal #47039433 sell 1.00 Si-3.18 at 57026 done (based on order #85223736)
2018.03.14 10:01:40.795 Trades  '289': deal #47039434 sell 1.00 Si-3.18 at 57025 done (based on order #85223736)