MQL5中的OOP问题 - 页 69

 
fxsaber:
我得到了一个意想不到的结果。


我认为,这些测试是没有可比性的

STRUCT2有一个构造函数

STRUCT2有字符串

没有关于MQL中实现的字符串的文档,我们讨论了https://www.mql5.com/ru/forum/1111/page2732#comment_16181920


即在你的测试中,STRUCT2作为一个带有构造函数的类工作,它有一个带有构造函数的 "字符串类",这实际上是为对象分配了几次内存。

我认为这样一个复杂的测试必须分成几个测试--创建STRUCT1和STRUCT2结构的时间,然后是访问数据的时间。 一些开发人员写道,字符串只有在访问字符串之后才分配内存--在你的例子中,字符串是由一个常数字符串初始化的,所以很难看到它是如何初始化的--编译器可能不会在访问字符串之前初始化(或分配内存?

 
Igor Makanu:

我认为这样一个复杂的测试应该被分解成几个测试

我甚至不想去打扰。我做了简单的结构。

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

// Простая структура.
struct STRUCT1
{
  int i;
  double j[2];
};

// Простая структура большего размера.
struct STRUCT3
{
  int i;
  double j[10];
};

template <typename T>
int Func( T &Array[] )
{  
  // Write
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Array[i].i = i;

  int Sum = 0;
  
  // Read
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i].i;
    
  return(Sum + ArraySize(Array));    
}

#include <Debug.mqh>

void OnStart()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT3 Array3[]; // Простая структура большего размера.
  
  const int Amount = 5 e7;
  
  Print(_B(ArrayResize(Array1, Amount), 1));
  Print(_B(ArrayResize(Array3, Amount), 1));
      
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  
  _P2(sizeof(STRUCT1));
  _P2(sizeof(STRUCT3));
}


        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


由于什么原因,对一个简单结构的第一个字段的访问取决于其大小--尚不清楚。

 
fxsaber:

我甚至不想去打扰。我做了简单的结构。



由于什么原因,对一个简单结构的第一个字段的访问取决于其大小--尚不清楚。

最好把这个问题问给相应分支的开发者。带有测试代码。要么他们会解释,要么他们会解决,要么他们什么都不说......只有第三种情况可能会在这里发挥作用。

 
Artyom Trishkin:

这是一个最好向相关分支的开发者提出的问题。有了测试代码。他们要么解释,要么解决,要么什么都不说......。这里可能只有第三种选择。

我的MT5已经开始造成过多的亵渎。有一些关键的错误。这是胡说八道。

 
fxsaber:

我甚至不想去打扰。我已经做了简单的结构。

现在,相同的STRUCT1和STRUCT3测试

fxsaber:

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

这只是一个猜测的游戏。

另一种方法是等待有人用C++做同样的测试并显示结果。 如果有很大的差异,这意味着MQL的内存分配 实现得很差

如果测试1和测试2大致相同,则是Windows在以这种方式分配内存。

 
fxsaber:

我的MT5已经开始造成过多的亵渎。有一些关键的错误。这是胡说八道。

建议你报告所有的bug。关键和不关键。当然是无情无义的 :)

 
Igor Makanu:

如果测试1和测试2大致相同,那么这就是Windows分配内存的方式。

运行了最后一次测试2次,在

终端 MetaTrader 5 x64 build 2470 开始为MetaQuotes软件公司服务。

Windows 10 build 18363, Intel Core i3-4170 @ 3.70GHz, 8/11GB内存, 188/297GB磁盘, IE 11, UAC, GMT+4

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 警报:Time[tst_f.mq5 53:ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 警报:Time[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 56: Func(Array1)] = 512 ms。

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 57: Func(Array3)] = 2218 ms。

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 2 ms。

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 9 ms。

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 56: Func(Array1)] = 552 ms。

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 57: Func(Array3)] = 1888 ms。

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 1333106752


不是所有的文件都附在脚本中,最后几行没有编译。

  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));

我有Debug.mqh的收录器


UPD: 在旧版本中我进行了测试

2020.05.30 17:17:27.604 终端 MetaTrader 5 - build 2361



2020.05.30 17:13:17.046 tst (EURUSD,H1) 警报:时间[tst.mq5 53: ArrayResize(Array1,Amount)] = 1 ms。

2020.05.30 17:13:17.047 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.053 tst (EURUSD,H1) 警报:时间[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms。

2020.05.30 17:13:17.053 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.563 tst (EURUSD,H1) Alert: Time[tst.mq5 56: Func(Array1)] = 510 ms.

2020.05.30 17:13:17.563 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:19.416 tst (EURUSD,H1) Alert: Time[tst.mq5 57: Func(Array3)] = 1852 ms.

2020.05.30 17:13:19.416 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:28.971 tst (EURUSD,H1) 警报:时间[tst.mq5 53: ArrayResize(Array1,Amount)] = 2 ms。

2020.05.30 17:13:28.971 tst (EURUSD,H1) 50000000

2020.05.30 17:13:28.977 tst (EURUSD,H1) Alert: Time[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:13:28.977 tst (EURUSD,H1) 50000000

2020.05.30 17:13:29.456 tst (EURUSD,H1) Alert: Time[tst.mq5 56: Func(Array1)] = 478 ms.

2020.05.30 17:13:29.456 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:31.192 tst (EURUSD,H1) Alert: Time[tst.mq5 57: Func(Array3)] = 1735 ms.

2020.05.30 17:13:31.192 tst (EURUSD,H1) 1333106752

结果是相似的 - 行为是相同的
 
试着交换他们的广告,这不取决于哪一个是在堆栈的顶部吗?
 
Artyom Trishkin:

所有的bug最好都要报告。关键与否。当然是不带感情色彩的 :)

已经建立了详细的分支。

 
Vladimir Simakov:
试着交换他们的公告,这不是取决于哪一个在堆栈的顶端吗?
void OnStart()
{
  STRUCT3 Array3[]; // Простая структура большего размера.
  STRUCT1 Array1[]; // Простая структура.
  
  
  const int Amount = 5 e7;
  
  Print(_B(ArrayResize(Array3, Amount), 1));
  Print(_B(ArrayResize(Array1, Amount), 1));
  
      
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  
  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));
}

2020.05.30 17:33:07.892 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 54:ArrayResize(Array3,Amount)] = 6 ms。

2020.05.30 17:33:07.955 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 55: ArrayResize(Array1,Amount)] = 1 ms。

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 58: Func(Array3)] = 1945 ms。

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 警报:时间[tst_f.mq5 59: Func(Array1)] = 450 ms。

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 1333106752

对我来说似乎没有任何区别。