Какие комментарии вы ждете, когда фраза "запрещены любые 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, и да прибудет с вами Сила ))
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, пишем в него ноль
Конечно, понимаю. Суть в том, что операция if медленнее. Вот два варианта, как они выглядят на асме, сгенерировано VS 2013 SP3, C++, оптимизация по скорости. В первом варианте одна ассемблерная инструкция, во втором 3. Все, тема закрыта, спорить не о чем.
Я ассемблер прокомментировал, чтобы было понятно. Вообще, полезно в ассемблерный код иногда заглядывать, улучшает карму )) В MQL он не генериться, но должно быть близко к коду VC++
А это с if, 3 иструкции на сравнение
Какой к чёрту if? Я же писал выше, что нужен вложенный цикл. А вы в полном цикле долбите эту битовую операцию непонятно зачем, и ещё удивляетесь почему у вас всё тормозит.
Да и сама по себе эта замена не равнозначна if, об этом я тоже писал уже несколько раз.
Если изначально значение tbIdx будет больше TICK_BUF_MAX_IDX, то if обнулит переменную, а &= не обнулит (точнее может обнулить, а может и нет, в зависимости от младших битов, короче как повезёт. Поэтому я сначала и не врубился, зачем оно вообще там.
Конечно, понимаю. Суть в том, что операция 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 не поддерживает ассемблерных вставок, но видимо есть на то причины )).
Какие комментарии вы ждете, когда фраза "запрещены любые 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 млн. итераций... - это ваще о чем?
Признаюсь, в этом цикле содержится сильная магия Древних, простите, я не имел права раскрывать ее непосвященным, поэтому и непонятно. Продолжайте используйте if, и да прибудет с вами Сила ))
...эта битовая операция нужна один раз на 16 млн. итераций... - это ваще о чем?
Потому что от 0 до 0xFFF будет столько итераций. И там нужен не if, а вложенный цикл.
Потому что от 0 до 0xFFF будет столько итераций.
Круто! А чему равен 0xFFF в десятичном представлении?
Ок, ошибся. Могли бы и поправить. Вы же, надеюсь, понимаете, что суть не в цифре.
Конечно, понимаю. Суть в том, что операция if медленнее. Вот два варианта, как они выглядят на асме, сгенерировано VS 2013 SP3, C++, оптимизация по скорости. В первом варианте одна ассемблерная инструкция, во втором 3. Все, тема закрыта, спорить не о чем.
Я ассемблер прокомментировал, чтобы было понятно. Вообще, полезно в ассемблерный код иногда заглядывать, улучшает карму )) В MQL он не генериться, но должно быть близко к коду VC++
А это с if, 3 иструкции на сравнение
Конечно, понимаю. Суть в том, что операция if медленнее. Вот два варианта, как они выглядят на асме, сгенерировано VS 2013 SP3, C++, оптимизация по скорости. В первом варианте одна ассемблерная инструкция, во втором 3. Все, тема закрыта, спорить не о чем.
Я ассемблер прокомментировал, чтобы было понятно. Вообще, полезно в ассемблерный код иногда заглядывать, улучшает карму )) В MQL он не генериться, но должно быть близко к коду VC++
А это с if, 3 иструкции на сравнение
Да и сама по себе эта замена не равнозначна if, об этом я тоже писал уже несколько раз.
Если изначально значение tbIdx будет больше TICK_BUF_MAX_IDX, то if обнулит переменную, а &= не обнулит (точнее может обнулить, а может и нет, в зависимости от младших битов, короче как повезёт. Поэтому я сначала и не врубился, зачем оно вообще там.
Конечно, понимаю. Суть в том, что операция if медленнее. Вот два варианта, как они выглядят на асме, сгенерировано VS 2013 SP3, C++, оптимизация по скорости. В первом варианте одна ассемблерная инструкция, во втором 3. Все, тема закрыта, спорить не о чем.
Я ассемблер прокомментировал, чтобы было понятно. Вообще, полезно в ассемблерный код иногда заглядывать, улучшает карму )) В MQL он не генериться, но должно быть близко к коду VC++
А это с if, 3 иструкции на сравнение
Сравнение на ассемблере займет все равно одну инструкцию CMP (хотя при оптимизации кода можно и без нее обойтись) все остальное - организация цикла(если он нужен).
К примеру:
Только чем оно Вам поможет? К слову операция CMP, отнимает столько же времени как и любая равнозначная математическая/логическая операция (SUB/ADD/AND/OR/XOR), поскольку CMP есть ни что иное как вычитание. Под термином "равнозначная" я имею ввиду второй операнд инструкции (константы или регистры). Жаль, конечно что MQL не поддерживает ассемблерных вставок, но видимо есть на то причины )).