MQL5中的OOP问题 - 页 71

 
Igor Makanu:

如果你写了这样的类。

根据你的研究判断,如果你在计算中频繁使用结构字段,B类的 执行速度会比较慢?

所以,我们讨论的是遍历一个对象数组的时间))

根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别,有两个隐含的字段是先走的,所以,数据字段会被移位,也就是在取消引用的时候进行额外的计算。

 
Vladimir Simakov:

所以,我们讨论的是遍历对象阵列的时间)))

根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别,有两个隐含的字段,这两个字段先走,所以,数据字段会被移位,也就是在取消引用的过程中进行额外的计算。

谢谢你,这很有帮助!

 
Vladimir Simakov:

所以,我们讨论的是遍历对象阵列的时间)))

根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别:有两个隐含的字段是先走的,所以数据字段会被访问到一个偏移量,也就是说,会进行额外的解引用计算。

这两个班级都很相似。在这两种情况下,访问都是通过偏移,只是不是相对于结构的开始,而是相对于类的开始。 换句话说,结构本身是没有重量的。 只有类产生了开销。
 
Vladimir Simakov:

所以,没有神秘主义--物理学规律在起作用。

它不符合 "物理学定律"。

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

long f1( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * i;
    
    Sum |= 1;
  }
    
  return(Sum);
}

long f2( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * (Amount - i);
    
    Sum |= 1;
  }
    
  return(Sum);
}

void OnStart()
{
  Print(_B(f1(2), 1));
  Print(_B(f1(200), 1));
  
  Print(_B(f2(2), 1));
  Print(_B(f2(200), 1));
}


        Alert: Time[Test6.mq5 267: f1(2)] = 3252 ms.
        6553255921290448385
        Alert: Time[Test6.mq5 268: f1(200)] = 4602 ms.
        -8757194524499019775
        Alert: Time[Test6.mq5 270: f2(2)] = 3061 ms.
        6553255931290448385
        Alert: Time[Test6.mq5 271: f2(200)] = 3112 ms.
        -8757193524499019775


这是一个自相矛盾的结果。更为复杂的计算会以1.5倍的速度进行,并且不取决于大小。

 
Vladimir Simakov:

所以,我们在讨论对象数组的遍历时间))))

根据你的例子,在pluses中是一样的,但是在mql中有一个细微的差别--有两个隐含的字段在前面,所以数据字段将以一个偏移量被访问,也就是说,将进行额外的解引用计算。

感谢Vladimir对汇编器的研究。
而正如Alexey所建议的,开销是由类创造的。
由此我们可以得出结论,如果你可以不使用类,那么最好用程序化风格来写代码。
也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你处理的是ticks,比如说,你最好直接使用它,而不使用包装器。
原则上,这是我遵循的方法,经常找到一个类的例子,我以程序化的方式拆解其方法。

 
Roman:

谢谢弗拉基米尔的集会研究。
而正如阿列克谢所建议的,开销创造了阶级。
由此我们可以得出结论,如果我们可以不使用类,最好是用程序化的方式来写代码。
也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你要处理的是ticks,比如说,你最好直接写,不要用包装器。
原则上,这是我一直遵循的方法,而且经常在找到一个类的例子后,用程序化的方法拆解其方法。

论坛上有一个巨魔...
我以前不明白为什么有些用户要求使用忽略功能,啊,现在怎么不见了?

 

关于交易、自动交易系统和策略测试的论坛

MQL5中的OOP问题

fxsaber, 2020.05.30 14:06

我不知道该如何处理它。我已经做了简单的结构。

        50000000
        50000000
        Alert: Time[Test6.mq5 280: Func(Array1)] = 312 ms.
        1333106752
        Alert: Time[Test6.mq5 281: Func(Array3)] = 1348 ms.
        1333106752
        : sizeof(STRUCT1) = 20
        : sizeof(STRUCT3) = 84

我不清楚为什么对一个简单结构的第一个字段的访问取决于其大小。

你在一个数组中使用50M的元素。
对于大小为20和84字节的结构,这分别是0.93GB和3.91GB的数据。
而在你的计算框架中,据推测,所有这些内存都要通过处理器的缓存。
而对这些结果的一个非常合理的解释是,0.93GB的数据从内存下载到CPU缓存的速度比3.91GB的数据快四倍。

C++测试的结果如何?
因为我看到了汇编代码,但没有测试结果,还是我看得很不顺眼?
 
Sergey Dzyublik:

论坛上有一个巨魔...
我以前不明白为什么有些用户要求使用忽略功能,啊,现在怎么不见了?

你应该注意自己,而不是别人。
答案是:不是你,也不是为了你。
在沉默中忽略))。

 
Sergey Dzyublik:
你在一个数组中使用50M的元素。
对于20和84字节的结构,这分别是0.93GB和3.91GB的数据。
而作为你计算的一部分,推测所有这些内存都会经过处理器的缓存。
而对这些结果的一个非常合理的解释是,0.93GB的数据从内存下载到CPU缓存的速度比3.91GB的数据快四倍。

C++测试的结果如何?
因为我看到了汇编代码,但没有测试结果,还是我看得很不顺眼?
它以同样的方式运作。它只是快了一点,但比例是一样的,所以它是硬件。
 
Roman:

谢谢弗拉基米尔的集会研究。
而正如阿列克谢所建议的,开销创造了阶级。
由此我们可以得出结论,如果我们可以不使用类,最好是用程序化的方式来写代码。
也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你要处理的是ticks,比如说,你最好直接写,不要用包装器。
原则上,这是我采取的方法,经常找到一个类的例子,我以程序化的方式拆解其方法。

你可以用一个结构来代替一个类,它们都很好。