Как использовать DLL в программе для Маркета? - страница 3

 
Renat:

Какие комментарии вы ждете, когда фраза "запрещены любые DLL" была несколько раз скопирована сюда?

Ни одна программа, которая содержит в себе import блоки, не будет принята даже на техническом уровне.

Да не дурак же я, про ДЛЛ давно ясно, я же спрашиваю про другое.

Импорт библиотек .ex4 и .ex5 тоже запрещен? Про это в правилах ни слова. И в этой ветке тоже никто не говорил об этом. Такой код будет считаться запрещенным или нет?

#import "Strategy3.ex4"
   bool GetParamsCount3(int& intCount[], int& doubleCount[], int& stringCount[], int& boolCount[], int& datetimeCount[], int& colorCount[]);
   void SetParams3(int &iArr[], double &dArr[], string &sArr[], bool &bArr[], datetime &dtArr[], color  &clArr[], int index, bool init, bool showAlert);
   int start3();
   int init3();
   int deinit3();
#import

 
Прошу прощения, я не сразу уловил суть алгоритма.  Щас стало понятно.  Просто как-то костыльно выглядит такое решение, как мне кажется.  Да и не рационально.  Если вам эта битовая операция нужна один раз на 16 млн. итераций, то зачем её сувать в общий цикл?  Что мешает сделать вложенный цикл?   Это вот как раз к вопросу оптимизации.  Рано ещё думать о распараллеливании и т.д., если сам алгоритм нужно сначала максимально оптимизировать.
 

...эта битовая операция нужна один раз на 16 млн. итераций... - это ваще о чем?

Признаюсь, в этом цикле содержится сильная магия Древних, простите, я не имел права раскрывать ее непосвященным, поэтому и непонятно. Продолжайте используйте if, и да прибудет с вами Сила ))

 
VDev:

...эта битовая операция нужна один раз на 16 млн. итераций... - это ваще о чем?

Потому что от 0 до 0xFFF будет столько итераций.  И там нужен не if, а вложенный цикл.

 
meat:

Потому что от 0 до 0xFFF будет столько итераций.

Круто! А чему равен 0xFFF в десятичном представлении?
 
VDev:
Круто! А чему равен 0xFFF в десятичном представлении?
Ок, перепутал. Могли бы и поправить.  Вы же, надеюсь, понимаете, что суть не в цифре.
 
meat:
Ок, ошибся. Могли бы и поправить.  Вы же, надеюсь, понимаете, что суть не в цифре.

Конечно, понимаю. Суть в том, что операция if медленнее. Вот два варианта, как они выглядят на асме, сгенерировано VS 2013 SP3, C++, оптимизация по скорости. В первом варианте одна ассемблерная инструкция, во втором 3. Все, тема закрыта, спорить не о чем.

Я ассемблер прокомментировал, чтобы было понятно. Вообще, полезно в ассемблерный код иногда заглядывать, улучшает карму )) В MQL он не генериться, но должно быть близко к коду VC++

        inc     eax

; 31   :         /* вместо
; 32   :         if(tbIdx > TICK_BUF_MAX_IDX)
; 33   :         tbIdx = 0;
; 34   :         */
; 35   :         tbIdx &= TICK_BUF_MAX_IDX; // небольшая оптимизация вместо if

        and     eax, 4095                               ; логическое И с 00000fffH

А это с if, 3 иструкции на сравнение

; 28   :     for (int n = 0; n < asize; n++)
; 29   :     {
; 30   :         tbIdx++;

        inc     eax             ; инкрементируем регистр, в нем уже находится значение tbIdx

; 31   :         if(tbIdx > TICK_BUF_MAX_IDX)

        xor     edx, edx        ; обнуляем регистр
        cmp     eax, 4095       ; 00000fffH
        cmovg   eax, edx        ; если eax > 4095, пишем в него ноль

 
VDev:

Конечно, понимаю. Суть в том, что операция if медленнее. Вот два варианта, как они выглядят на асме, сгенерировано VS 2013 SP3, C++, оптимизация по скорости. В первом варианте одна ассемблерная инструкция, во втором 3. Все, тема закрыта, спорить не о чем.

Я ассемблер прокомментировал, чтобы было понятно. Вообще, полезно в ассемблерный код иногда заглядывать, улучшает карму )) В MQL он не генериться, но должно быть близко к коду VC++

А это с if, 3 иструкции на сравнение

Какой к чёрту if?  Я же писал выше, что нужен вложенный цикл.  А вы в полном цикле долбите эту битовую операцию непонятно зачем, и ещё удивляетесь почему у вас всё тормозит.
 

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

Если изначально значение tbIdx  будет больше TICK_BUF_MAX_IDX, то  if обнулит переменную, а &= не обнулит (точнее может обнулить, а может и нет, в зависимости от младших битов, короче как повезёт. Поэтому я сначала и не врубился, зачем оно вообще там.

 
VDev:

Конечно, понимаю. Суть в том, что операция if медленнее. Вот два варианта, как они выглядят на асме, сгенерировано VS 2013 SP3, C++, оптимизация по скорости. В первом варианте одна ассемблерная инструкция, во втором 3. Все, тема закрыта, спорить не о чем.

Я ассемблер прокомментировал, чтобы было понятно. Вообще, полезно в ассемблерный код иногда заглядывать, улучшает карму )) В MQL он не генериться, но должно быть близко к коду VC++

А это с if, 3 иструкции на сравнение

Сравнение на ассемблере займет все равно одну инструкцию CMP (хотя при оптимизации кода можно и без нее обойтись) все остальное - организация цикла(если он нужен).

К примеру:

; цикл c CMP
         XOR EAX,EAX
cycle:   INC EAX
         CMP EAX, 0FFFh
         JNZ cycle

; обратный цикл без CMP
         MOV EAX, 0FFFh
cycle:   DEC EAX
         JNZ cycle

Только чем оно Вам поможет? К слову операция CMP, отнимает столько же времени как и любая равнозначная математическая/логическая операция (SUB/ADD/AND/OR/XOR), поскольку CMP есть ни что иное как вычитание. Под термином "равнозначная" я имею ввиду второй операнд инструкции (константы или регистры). Жаль, конечно что MQL не поддерживает ассемблерных вставок, но видимо есть на то причины )).

Причина обращения: