MQL5中的OOP问题 - 页 87

 
Vladimir Simakov:
问题。你为什么需要一个手风琴?如果在一个方法,一个类别,在球状马中,是的,在物理真空中(好吧,我醉了)))),那么是的,它有意义。如果在一个真正的项目中,要么在全局层面上有一个类,要么有一个处理所有这些trichomudin的loner(对不起,在处理程序的开头有一个额外的bourbon))))),而且,在任何地方直接从它那里请求)))

它是一个班级管理者,负责分配任务,并从一小群下属班级中获得结果))))。

一般来说,很难冷静地解释

但问题是相关的--当从不同的方法中读取这些字段的值时,如何对共同的字段进行寻址,而且往往是

 
Igor Makanu:

它是一个班级管理者,负责分配任务,并从一小群下属班级中获得结果))))。

一般来说,很难冷静地解释

但问题是相关的--当从不同的方法中读取这些字段的值时,如何对共同的字段进行寻址,而且往往是

看。在处理程序的开始,不管是哪一个,你都要启动gSomeGlobal.SomeEvent(...),或者,如果是单一的,Alone::SomeEvent(...),在这个方法中做需要的状态处理,然后,简单地通过getters请求需要的数据。只要你不是一个高频的黄牛,你就可以搞砸所有的速度主张,尽管这里没有特别的开销)))
 
Vladimir Simakov:
另见。在处理程序的开始,不管是哪一个,你都要启动gSomeGlobal.SomeEvent(...),或者,如果是单一的,Alone::SomeEvent(...),在这个方法中,你做所需的状态处理,然后,你就通过getters请求所需的数据。只要你不是一个高频的黄牛,你就可以搞砸所有的速度主张,尽管这里没有特别的开销)))

mt5的性能足以满足每秒10500个订单的需求,通道也就足够了。

我在寻找真相,我必须检查它......如果你想做什么,就自己去做!))))。

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"

#define  TST_COUNT 1 e10

#define    SpeedTest(count,msg,EX)   {uint mss=GetTickCount(); ulong lim = count; for(ulong cnt=0;cnt<lim&&!_StopFlag;cnt++){EX;} \
                                    printf("%s: loops = %llu ms=%u",msg,lim,GetTickCount()-mss);}
//+------------------------------------------------------------------+
class A
{
private:
   double            _Ask, _Bid;
   double            f1()  { return(_Ask + 1.0/(1.0+(double)rand())); }
   double            f2()  { return(_Bid + 1.0/(1.0+(double)rand())); }
   double            f3()  { return(_Ask/_Bid + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){ _Ask = tick.ask; _Bid = tick.bid; return(f1() + f2() + f3()); }
};
//+------------------------------------------------------------------+
class B
{
private:
   double            f1(const MqlTick &t)  { return(t.ask + 1.0/(1.0+(double)rand())); }
   double            f2(const MqlTick &t)  { return(t.bid + 1.0/(1.0+(double)rand())); }
   double            f3(const MqlTick &t)  { return(t.ask/t.bid + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){ return(f1(tick) + f2(tick) + f3(tick)); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   B b;
   MqlTick rnd_tick;
   for(int i=0; i<5; i++)
   {
      SpeedTest(TST_COUNT, "class A : ",
               rnd_tick.ask = 1.0 + 1.0 / (1.0 + (double)rand());
               rnd_tick.bid = 1.0 + 1.0 / (1.0 + (double)rand());
               double res = a.calc(rnd_tick);
      );
   
      SpeedTest(TST_COUNT, "class B : ",
               rnd_tick.ask = 1.0 + 1.0 / (1.0 + (double)rand());
               rnd_tick.bid = 1.0 + 1.0 / (1.0 + (double)rand());
               double res = b.calc(rnd_tick);
      );
   }
}
//+------------------------------------------------------------------+

2020.07.25 18:00:07.293 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38062

速度对优化至关重要,这就是我想了解的原因。

一般来说,引用必须将当前价格 传递给所有方法



UPD。

//+------------------------------------------------------------------+
class C
{
private:
   double            f1(const double &a, const double &b)  { return(a + 1.0/(1.0+(double)rand())); }
   double            f2(const double &a, const double &b)  { return(b + 1.0/(1.0+(double)rand())); }
   double            f3(const double &a, const double &b)  { return(a/b + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){const double ask = tick.ask; const double bid = tick.bid; return(f1(ask,bid) + f2(ask,bid) + f3(ask,bid)); }
};
//+------------------------------------------------------------------+

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37985

 
Igor Makanu:

mt5的性能足以满足每秒10500个订单的需求,通道也就足够了。

我在寻找真相,我必须检查它......如果你想做什么,就自己去做!))))。

2020.07.25 18:00:07.293 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:00:45.273 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=37968

2020.07.25 18:01:31.405 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 18:02:09.423 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38016

2020.07.25 18:02:55.558 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 18:03:33.635 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078

2020.07.25 18:04:21.969 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=48344

2020.07.25 18:05:00.113 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38140

2020.07.25 18:05:46.503 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46391

2020.07.25 18:06:24.573 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38062

速度对优化至关重要,这就是我想了解的原因。

一般来说,引用必须将当前价格 传递给所有方法



UPD。

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37985

对于初学者来说,做同样的工作条件))))。因为你插入了一个绝对不必要的赋值运算符(2个),从而产生了一个明知非最佳的代码))。

//+------------------------------------------------------------------+
class A
{
private:
   double            _Ask, _Bid;
   double            f1()  { return(_Ask + 1.0/(1.0+(double)rand())); }
   double            f2()  { return(_Bid + 1.0/(1.0+(double)rand())); }
   double            f3()  { return(_Ask/_Bid + 1.0/(1.0+(double)rand())); }
public:
   void              Init() {_Ask = 1.0 + 1.0 / (1.0 + (double)rand());
                             _Bid = 1.0 + 1.0 / (1.0 + (double)rand());}
   double            calc(){return(f1() + f2() + f3()); }
};
//+------------------------------------------------------------------+
class B
{
private:
   double            f1(const MqlTick &t)  { return(t.ask + 1.0/(1.0+(double)rand())); }
   double            f2(const MqlTick &t)  { return(t.bid + 1.0/(1.0+(double)rand())); }
   double            f3(const MqlTick &t)  { return(t.ask/t.bid + 1.0/(1.0+(double)rand())); }
public:
   double            calc(const MqlTick &tick){ return(f1(tick) + f2(tick) + f3(tick)); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   B b;
   MqlTick rnd_tick;
   for(int i=0; i<5; i++)
   {
      SpeedTest(TST_COUNT, "class A : ",
               a.Init();
               double res = a.calc();
      );
   
      SpeedTest(TST_COUNT, "class B : ",
               rnd_tick.ask = 1.0 + 1.0 / (1.0 + (double)rand());
               rnd_tick.bid = 1.0 + 1.0 / (1.0 + (double)rand());
               double res = b.calc(rnd_tick);
      );
   }
}

现在有一个问题:什么对你来说更方便?当然,你可以通过方法参数拖动一连串的链接,也可以很好地做到这一点。自己比较一下速度))))。

 
Vladimir Simakov:

但你采取了一个绝对不必要的赋值运算符(2个),从而创造了一个明知是次优的代码))。

那不是我!

这是IBM知识中心!https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



那里的条件是一样的,每一次打勾你都需要调用类管理器(或超类,我不知道)。

并调用其余的类,这些类根据它们的策略工作。

但为了论证,变体C在速度上确实胜出,所以knowelege_center算是说了实话。

 
Pavel Verveyko:

我不知道这是一个小故障还是一个功能)

,在类实例里面有一个结构。

我放了一个点来查看结构的内容。
但只有在我加上方括号时才会显示。
虽然结构在一个实例中。

,如果该类不是一个数组元素,问题就解决了。




这里是 "打探 "的代码。

试着编译它,即使有错误。有时它会 "唤醒 "编辑

 
Igor Makanu:

那不是我!

这是IBM知识中心!当前价格 传递给所有方法



UPD。

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37985

Igor Makanu:

这不是我!

这是IBM知识中心!https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html



那里的条件是一样的,每次打勾你都需要调用类管理器(或超类,我不知道)。

并调用其余的类,这些类根据它们的策略工作。

但是,对于这一点--选项C在速度上确实胜出,即它的knowelege_center还算说得过去。

它当然会赢)。但不是因为它写得很好,而是因为编译器变得更聪明了)。纯粹的优化。在发布代码中没有分配Ask和Bid值)))但是,当你要处理的参数少一点,而且项目的业务逻辑会比按指标开单多一点,那么我就会明白你怎么会厌倦在整个项目中拖动一串链接))))是的,我已经告诉你过度优化的罪恶。相信我,在98%的情况下你不需要它。

 
Vladimir Simakov:

是的,我已经告诉过你过度优化的罪恶。相信我,98%的时间你都不需要它。

我愿意!...但我的直觉告诉我,除非我把它弄好,否则我不能把它弄好))))。

好的,谢谢,这个研究有一些好的意义。

[删除]  
Igor Makanu:


UPD。

2020.07.25 19:03:37.210 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.25 19:04:15.201 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:04:53.188 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37984

2020.07.25 19:05:39.321 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46125

2020.07.25 19:06:17.313 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.25 19:06:55.306 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=37985

也可以这样试一试。

class D
{
   double f1(const double &a, const double &b)  { return(a + 1.0/(1.0+(double)rand())); }
   double f2(const double &a, const double &b)  { return(b + 1.0/(1.0+(double)rand())); }
   double f3(const double &a, const double &b)  { return(a/b + 1.0/(1.0+(double)rand())); }
   
public:
   double calc( const MqlTick& tick )
   {
      return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid );
   }
};
 
Koldun Zloy:

也可以试试这种方式。

2020.07.26 09:39:21.350 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46157

2020.07.26 09:39:59.402 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38046

2020.07.26 09:40:37.455 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=38063

2020.07.26 09:41:15.485 class_global (EURUSD,H1) class D : : 循环 = 10000000000 ms=38031

2020.07.26 09:42:01.749 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46266

2020.07.26 09:42:39.754 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.26 09:43:17.753 class_global (EURUSD,H1) class C :: 循环 = 10000000000 ms=38000

2020.07.26 09:43:55.743 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=37984

同样的数值,测试速度由于某种原因而 "浮动",但在方法中通过链接传递参数 仍然更有效率。