Тесты на вычисление числа Pi для mql4, mql5, MSVC, Intel compilators - страница 3

 
Dr.Trader:

В смысле чтоб сам эксперт получился бинарником, и мог запускаться и работать без терминала? Мне это нравится :)

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

Теперь прикидываем, какой сотой доле процента трейдеров это нужно..
 
Dr.Trader:

В смысле чтоб сам эксперт получился бинарником, и мог запускаться и работать без терминала? Мне это нравится :)

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

Да, именно так!!! Плюсов на самом деле много!!!

Думается на самом деле желающих было бы гораздо больше, чем вам оно видится! Но тут вопрос про расширение диапазона применения, который только лишь трейдерами бы не ограничился. Раз уж делается упор на самый быстрый язык, который может всё, и при этом делает это в разы быстрее - так почему бы не пустить его в массы именно как язык, а не как средство построения торговых систем?
 
Renat Fatkhullin:

Да, появится из важного:

  1. Расширенный OpenCL со штатной расчетной математической библиотекой на OpenCL. Конечно, с ограниченным набором функций, который поддается распараллеливанию.
  2. Новый тип программ в виде постоянных сервисов и функций взаимодействия между программами
  3. Кастомные датафиды и синтетические инструменты

Ну и конечно десятки других вещей, которые будут описаны в релизах.

Можно чуть подробнее про кастомные фиды, пожалуйста, как это будет выглядеть? У меня стоит вопрос о покупке дорогой софтины, например, а не хотелось бы.. а если будет прямой доступ к другим брокерским api в МТ5 то это вообще круто
 
Maxim Dmitrievsky:
Можно чуть подробнее про кастомные фиды, пожалуйста, как это будет выглядеть? У меня стоит вопрос о покупке дорогой софтины, например, а не хотелось бы.. а если будет прямой доступ к другим брокерским api в МТ5 то это вообще круто
Пока без подробностей
 
Если делать что-то посложнее, чем складывать числа в регистрах, то результат становится не таким красивым (из-за проверки на выход за границы массива, думаю). Си шный код:
#include <stdio.h>
#include <time.h>

int main()
{
  clock_t t1 = time(NULL);
  
#define CNT     700000000
  double x_sum = 0;
  double y_sum = 0;
  double xy_sum = 0;
  double x2_sum = 0;

  double ticks[9] = {0.00001, 0.00007, -0.00002, 0.00009, 0.00004, -0.00008, -0.00005, 0.00009, 0.00005};
  double cur_y = 0;
  for(unsigned i = 0;  i < CNT;  ++ i)
    {
      cur_y = cur_y + ticks[i%9];
      x_sum += i;
      y_sum += cur_y;
      xy_sum += i*cur_y;
      x2_sum += (double)i*i;
    }
  double num = CNT * xy_sum - x_sum * y_sum;
  double den = CNT * x2_sum - x_sum * x_sum;
  printf("execution time = %i sec\n", (int)(time(NULL)-t1));
  printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",
         num/den, x_sum, y_sum, xy_sum, x2_sum);

}

execution time = 4 sec
res = 0.000022
x_sum = 244999999650000000.000000
y_sum = 5444444453002.445312
xy_sum = 2540740741014408396800.000000
x2_sum = 114333333088333677461504000.000000

МКЛ код:

void OnStart()
{
   uint t1 = GetTickCount();
  
#define CNT     700000000
  double x_sum = 0;
  double y_sum = 0;
  double xy_sum = 0;
  double x2_sum = 0;

  double ticks[9] = {0.00001, 0.00007, -0.00002, 0.00009, 0.00004, -0.00008, -0.00005, 0.00009, 0.00005};
  double cur_y = 0;
  for(unsigned i = 0;  i < CNT;  ++ i)
    {
      cur_y = cur_y + ticks[i%9];
      x_sum += i;
      y_sum += cur_y;
      xy_sum += i*cur_y;
      x2_sum += (double)i*i;
    }
  double num = CNT * xy_sum - x_sum * y_sum;
  double den = CNT * x2_sum - x_sum * x_sum;
  printf("execution time = %i sec\n", (int)(GetTickCount()-t1)/1000);
  printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",
         num/den, x_sum, y_sum, xy_sum, x2_sum);
  return;

}

2017.02.01 04:29:08.386 temp___ (USDCHF,H1)     execution time = 64 sec

медленнее примерно в 16 раз.

x32, мт под вайном, Intel(R) Core(TM)2 Duo CPU     P7350  @ 2.00GHz

 
pavlick_:
Если делать что-то посложнее, чем складывать числа в регистрах, то результат становится не таким красивым (из-за проверки на выход за границы массива, думаю). Си шный код:


медленнее примерно в 16 раз.

x32, мт под вайном, Intel(R) Core(TM)2 Duo CPU     P7350  @ 2.00GHz

Во первых, не надо никакого вайна, во вторых - только x64, а в третьих тесты с погрешностью в 1 сек не делают. Посмотрите на условия тестирования в начале ветки.

В MQL5 упор только на новый развиваемый 64 битный компилятор, который в разы быстрее 32 битного. Забудьте про 32 битный код, как мы про него. 32 битная версия MQL5 использует старый компилятор, единый с MQL4. Об этом многократно писалось и объяснялось.
 
Вот поправленный код, считающий миллисекунды (time заменен на GetTickCount).

MSVC 2015 C++, x64, абсолютно полная оптимизация:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <time.h>

#define CNT     700000000
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int main()
  {
   unsigned int t1=GetTickCount();

   double x_sum=0;
   double y_sum=0;
   double xy_sum=0;
   double x2_sum=0;

   double ticks[9]={ 0.00001, 0.00007, -0.00002, 0.00009, 0.00004, -0.00008, -0.00005, 0.00009, 0.00005 };
   double cur_y=0;
   for(unsigned i=0; i < CNT; ++i)
     {
      cur_y=cur_y + ticks[i%9];
      x_sum+=i;
      y_sum+=cur_y;
      xy_sum+=i*cur_y;
      x2_sum+=(double)i*i;
     }
   double num=CNT * xy_sum - x_sum * y_sum;
   double den=CNT * x2_sum - x_sum * x_sum;
   printf("execution time = %u msec\n",GetTickCount()-t1);
   printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",num/den, x_sum, y_sum, xy_sum, x2_sum);

  }


execution time = 1672 msec
res = 0.000022
x_sum = 244999999367108928.000000
y_sum = 5444444445431.175781
xy_sum = 2540740737455829286912.000000
x2_sum = 114333333088352626857213952.000000
Вот MQL5 x64:
#define CNT     700000000

void OnStart()
  {
   uint t1=GetTickCount();

   double x_sum = 0;
   double y_sum = 0;
   double xy_sum = 0;
   double x2_sum = 0;

   double ticks[9]={0.00001,0.00007,-0.00002,0.00009,0.00004,-0.00008,-0.00005,0.00009,0.00005};
   double cur_y=0;

   for(unsigned i=0;  i<CNT;++ i)
     {
      cur_y=cur_y+ticks[i%9];
      x_sum += i;
      y_sum += cur_y;
      xy_sum += i*cur_y;
      x2_sum += (double)i*i;
     }
   double num = CNT * xy_sum - x_sum * y_sum;
   double den = CNT * x2_sum - x_sum * x_sum;
   printf("execution time = %u msec\n",GetTickCount()-t1);
   printf("res = %f\nx_sum = %f\ny_sum = %f\nxy_sum = %f\nx2_sum = %f\n",num/den,x_sum,y_sum,xy_sum,x2_sum);
  }


2017.01.31 22:23:56.330    TestPi (Si-3.17,H1)    execution time = 1422 msec
2017.01.31 22:23:56.330    TestPi (Si-3.17,H1)   
2017.01.31 22:23:56.330    TestPi (Si-3.17,H1)    res = 0.000022
2017.01.31 22:23:56.330    TestPi (Si-3.17,H1)    x_sum = 244999999367108928.000000
2017.01.31 22:23:56.330    TestPi (Si-3.17,H1)    y_sum = 5444444445431.175781
2017.01.31 22:23:56.330    TestPi (Si-3.17,H1)    xy_sum = 2540740737455829286912.000000
2017.01.31 22:23:56.330    TestPi (Si-3.17,H1)    x2_sum = 114333333088352626857213952.000000

Видно, как MQL5 порвал C++, уложившись в 1 422 миллисекунды по сравнению с 1 672 миллисекунды.

То есть, ваш пример показал все наоборот. Не проигрыш в 16 раз, а выигрыш в 1.17 раз.

Это на Windows 10 Pro x64, Intel Xeon  E5-2690 v3 @ 2.60GHz
 
Renat Fatkhullin:
Во первых, не надо никакого вайна ..
С удовольствием забыл про вайн, если бы была версия под Линукс. Я не утверждаю, что мой тест объективный и правильный, поделился наблюдениями. Я даже и не хотел измерить производительность, а проверял хватит ли ширины мантиссы у дабла для МНК, заодно прогнал в МКЛ.
 
pavlick_:
С удовольствием забыл про вайн, если бы была версия под Линукс. Я не утверждаю, что мой тест объективный и правильный, поделился наблюдениями. Я даже и не хотел измерить производительность, а проверял хватит ли ширины мантиссы у дабла для МНК, заодно прогнал в МКЛ.
Посмотрите на мой тест в #27.

MQL5 порвал C++ как Тузик грелку.
 
pavlick_:
Если делать что-то посложнее, чем складывать числа в регистрах, то результат становится не таким красивым (из-за проверки на выход за границы массива, думаю). Си шный код:
...

МКЛ код:

...

медленнее примерно в 16 раз.

x32, мт под вайном, Intel(R) Core(TM)2 Duo CPU     P7350  @ 2.00GHz

Павлик, не спеши с выводами!!!! У тебя какой-то косяк с примером)))))))))))))))))
Си

МКЛ


Скорость по твоему тесту одинаковая!!!!!!!!

Ясное дело, что на сложных вычислениях Си порвет МКЛ, на Си можно так же подключить C++ AMP, и/или OpenMP. 

Но на мкл гораздо проще научиться писать(даже с учетом сильной похожести языков), т.к. полно встроенных функций, необходимых именно для написания робота или индикатора.

Я считаю, что у МКЛ достойная производительность, а если ее не хватает, то можно подключить прогу на С++, через Named Pipes. Или длл)

Renat Fatkhullin, опередил меня, но я не стал править исходники, а просто как есть скомпилил))
Причина обращения: