MQL5中的OOP问题 - 页 69 1...626364656667686970717273747576...96 新评论 Igor Makanu 2020.05.30 12:24 #681 fxsaber: 我得到了一个意想不到的结果。 我认为,这些测试是没有可比性的 STRUCT2有一个构造函数 STRUCT2有字符串 没有关于MQL中实现的字符串的文档,我们讨论了https://www.mql5.com/ru/forum/1111/page2732#comment_16181920。 即在你的测试中,STRUCT2作为一个带有构造函数的类工作,它有一个带有构造函数的 "字符串类",这实际上是为对象分配了几次内存。 我认为这样一个复杂的测试必须分成几个测试--创建STRUCT1和STRUCT2结构的时间,然后是访问数据的时间。 一些开发人员写道,字符串只有在访问字符串之后才分配内存--在你的例子中,字符串是由一个常数字符串初始化的,所以很难看到它是如何初始化的--编译器可能不会在访问字符串之前初始化(或分配内存? fxsaber 2020.05.30 14:06 #682 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 由于什么原因,对一个简单结构的第一个字段的访问取决于其大小--尚不清楚。 Artyom Trishkin 2020.05.30 14:14 #683 fxsaber: 我甚至不想去打扰。我做了简单的结构。 由于什么原因,对一个简单结构的第一个字段的访问取决于其大小--尚不清楚。 最好把这个问题问给相应分支的开发者。带有测试代码。要么他们会解释,要么他们会解决,要么他们什么都不说......只有第三种情况可能会在这里发挥作用。 fxsaber 2020.05.30 14:17 #684 Artyom Trishkin: 这是一个最好向相关分支的开发者提出的问题。有了测试代码。他们要么解释,要么解决,要么什么都不说......。这里可能只有第三种选择。 我的MT5已经开始造成过多的亵渎。有一些关键的错误。这是胡说八道。 Igor Makanu 2020.05.30 14:26 #685 fxsaber: 我甚至不想去打扰。我已经做了简单的结构。 现在,相同的STRUCT1和STRUCT3测试 fxsaber:我不明白为什么对一个简单结构的第一个字段的访问取决于其大小。 这只是一个猜测的游戏。 另一种方法是等待有人用C++做同样的测试并显示结果。 如果有很大的差异,这意味着MQL的内存分配 实现得很差 如果测试1和测试2大致相同,则是Windows在以这种方式分配内存。 Artyom Trishkin 2020.05.30 14:35 #686 fxsaber: 我的MT5已经开始造成过多的亵渎。有一些关键的错误。这是胡说八道。 建议你报告所有的bug。关键和不关键。当然是无情无义的 :) Igor Makanu 2020.05.30 15:05 #687 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 结果是相似的 - 行为是相同的 Questions on OOP in Why my stop loss BUG - Notifications: not Vladimir Simakov 2020.05.30 15:27 #688 试着交换他们的广告,这不取决于哪一个是在堆栈的顶部吗? fxsaber 2020.05.30 15:32 #689 Artyom Trishkin: 所有的bug最好都要报告。关键与否。当然是不带感情色彩的 :) 已经建立了详细的分支。 Igor Makanu 2020.05.30 15:34 #690 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 对我来说似乎没有任何区别。 Questions on OOP in Can EA's with Time Synchronise Windows local time 1...626364656667686970717273747576...96 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我得到了一个意想不到的结果。
我认为,这些测试是没有可比性的
STRUCT2有一个构造函数
STRUCT2有字符串
没有关于MQL中实现的字符串的文档,我们讨论了https://www.mql5.com/ru/forum/1111/page2732#comment_16181920。
即在你的测试中,STRUCT2作为一个带有构造函数的类工作,它有一个带有构造函数的 "字符串类",这实际上是为对象分配了几次内存。
我认为这样一个复杂的测试必须分成几个测试--创建STRUCT1和STRUCT2结构的时间,然后是访问数据的时间。 一些开发人员写道,字符串只有在访问字符串之后才分配内存--在你的例子中,字符串是由一个常数字符串初始化的,所以很难看到它是如何初始化的--编译器可能不会在访问字符串之前初始化(或分配内存?
我认为这样一个复杂的测试应该被分解成几个测试
我甚至不想去打扰。我做了简单的结构。
由于什么原因,对一个简单结构的第一个字段的访问取决于其大小--尚不清楚。
我甚至不想去打扰。我做了简单的结构。
由于什么原因,对一个简单结构的第一个字段的访问取决于其大小--尚不清楚。
最好把这个问题问给相应分支的开发者。带有测试代码。要么他们会解释,要么他们会解决,要么他们什么都不说......只有第三种情况可能会在这里发挥作用。
这是一个最好向相关分支的开发者提出的问题。有了测试代码。他们要么解释,要么解决,要么什么都不说......。这里可能只有第三种选择。
我的MT5已经开始造成过多的亵渎。有一些关键的错误。这是胡说八道。
我甚至不想去打扰。我已经做了简单的结构。
现在,相同的STRUCT1和STRUCT3测试
我不明白为什么对一个简单结构的第一个字段的访问取决于其大小。
这只是一个猜测的游戏。
另一种方法是等待有人用C++做同样的测试并显示结果。 如果有很大的差异,这意味着MQL的内存分配 实现得很差
如果测试1和测试2大致相同,则是Windows在以这种方式分配内存。
我的MT5已经开始造成过多的亵渎。有一些关键的错误。这是胡说八道。
建议你报告所有的bug。关键和不关键。当然是无情无义的 :)
如果测试1和测试2大致相同,那么这就是Windows分配内存的方式。
运行了最后一次测试2次,在
终端 MetaTrader 5 x64 build 2470 开始为MetaQuotes软件公司服务。
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
不是所有的文件都附在脚本中,最后几行没有编译。
我有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
所有的bug最好都要报告。关键与否。当然是不带感情色彩的 :)
已经建立了详细的分支。
试着交换他们的公告,这不是取决于哪一个在堆栈的顶端吗?
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